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

 

 

    修改操作

 

 

 完整代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath> 
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
",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;
} 
原文地址:https://www.cnblogs.com/hzoi-poozhai/p/12638332.html