用线段树,关键点在于,一般用线段树时,先建树、再更新、再查询。
而这种方法把它们综合在一起!!!
别人的代码。。。。。。。~_~
#include<stdio.h>
#include<string.h>using namespace std;
int sign[1 << 18];
void update(int o, int l, int r,int p, int v, bool t){
int M = (l + r)>>1;
if(l == r) sign[o] = v;
else {
if( p <= M) update(o<<1, l, M, p, v, !t);
else update(o<<1|1, M+1, r, p, v, !t);
if(t){
sign[o] = sign[o<<1]|sign[o<<1|1];
}
else sign[o] = sign[o<<1] ^ sign[o<<1|1];
}
}
int main(){
int n, m;
while(scanf("%d%d", &n, &m) != EOF){
int v;
for(int i = 0; i < (1 << n); ++i){
scanf("%d", &v);
update(1,0,(1<<n)-1, i, v, n%2);
}
int p;
for(int i = 0; i < m; i++){
scanf("%d%d", &p, &v);
update(1, 0, (1<<n)-1, p-1, v, n%2);
printf("%d\n", sign[1]);
}
}
return 0;
}