zwei(树状数组维护异或和)

zwei(树状数组维护异或和)_第1张图片

 

 

 zwei(树状数组维护异或和)_第2张图片

 

 

 zwei(树状数组维护异或和)_第3张图片

 

zwei(树状数组维护异或和)_第4张图片

    修改操作

 zwei(树状数组维护异或和)_第5张图片

 

 zwei(树状数组维护异或和)_第6张图片

 

 完整代码

#include
#include
#include
#include
#include 
using namespace std;
const int maxn = 1e8;
int c[maxn],f[maxn];
int lowbit(int x){return x & (-x);}
void add(int x,int n){
    while(x<=maxn){
        c[x] ^= n;
        x += lowbit(x);
    }
}
void ans(int l,int r){
    int sl = 0 ,sr = 0;
    while(l){
        sl ^= c[l];
        l -= lowbit(l);
    }
    while(r){
        sr ^= c[r];
        r -= lowbit(r);
    }
    printf("%d\n",sr ^ sl);
}
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&f[i]);
        add(i,f[i]);
    }
    for(int i=1;i<=m;i++){
        int a,b,c;scanf("%d%d%d",&a,&b,&c);
        if(a == 0){
            int v = f[b]^c;
            add(b,v);
            f[b] =  c;
        }
        else
        {
            ans(b-1,c);
        }
        
    }
    return 0;
} 

 

你可能感兴趣的:(zwei(树状数组维护异或和))