Codeforces 339D-Xenia and Bit Operations(線段樹)
阿新 • • 發佈:2020-10-16
- 還是比較明顯的線段樹的操作
#include<bits/stdc++.h> using namespace std; const int N=2e6+10; int a[N]; int tn,m,n; struct stree{ int id,num; }tree[N<<2]; int ls(int x) {return x<<1;} int rs(int x) {return x<<1|1;} void pushup(int rt) { tree[rt].id=tree[ls(rt)].id^1; if(tree[rt].id==1){ tree[rt].num=tree[ls(rt)].num|tree[rs(rt)].num; return; }else{ tree[rt].num=tree[ls(rt)].num^tree[rs(rt)].num; } } void build(int rt,int l,int r) { if(l==r){ tree[rt].num=a[l]; tree[rt].id=0; return; } int mid=(l+r)/2; build(ls(rt),l,mid); build(rs(rt),mid+1,r); pushup(rt); } void update(int rt,int Id,int num,int l,int r) { if(l==r&&l==Id){ tree[rt].num=num; return; } int mid=(l+r)/2; if(Id<=mid) update(ls(rt),Id,num,l,mid); else update(rs(rt),Id,num,mid+1,r); pushup(rt); } int queryFirst(int rt) { return tree[rt].num; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>tn>>m; n=pow(2,tn); for(int i=1;i<=n;++i) cin>>a[i]; build(1,1,n); for(int i=0;i<m;++i){ int p,b; cin>>p>>b; a[p]=b; update(1,p,b,1,n); cout<<queryFirst(1)<<"\n"; } return 0; }