CF 197 DIV2 Xenia and Bit Operations 线段树

线段树!!1A

代码如下:

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #define lson i<<1
 4 #define rson i<<1|1
 5 #define MAX 140000
 6 #define ll __int64
 7 using namespace std;
 8 ll a[MAX],s;
 9 struct tree
10 {
11     int l,r;
12     ll res;
13     bool flag;
14 }T[3*MAX];
15 //奇数OR,偶数XOR
16 void built(int i,int l,int r,bool f)
17 {
18     T[i].l=l;
19     T[i].r=r;
20     T[i].flag=f;
21     if(l==r){
22         T[i].res=a[l];
23         return ;
24     }
25     int m=(l+r)>>1;
26     built(lson,l,m,!f);
27     built(rson,m+1,r,!f);
28     if(T[i].flag) T[i].res=T[lson].res|T[rson].res;
29     else T[i].res=T[lson].res^T[rson].res;
30 }
31 void update(int i,int d,ll p)
32 {
33     if(T[i].l==d&&T[i].r==d){
34         T[i].res=p;
35         return ;
36     }
37     int m=(T[i].l+T[i].r)>>1;
38     if(d<=m) update(lson,d,p);
39     else if(d>m) update(rson,d,p);
40     if(T[i].flag) T[i].res=T[lson].res|T[rson].res;
41     else T[i].res=T[lson].res^T[rson].res;
42 }
43 int main()
44 {
45     int n,m,i,k;
46     while(scanf("%d%d",&n,&m)!=EOF){
47         for(i=1;i<=(1<<n);i++) scanf("%I64d",&a[i]);
48         built(1,1,(1<<n),n&1);
49         for(i=0;i<m;i++){
50             scanf("%d %I64d",&k,&s);
51             update(1,k,s);
52             printf("%I64d\n",T[1].res);
53         }
54     }
55     return 0;
56 }
View Code

 

 

 

posted @ 2013-09-01 09:52  _随心所欲_  阅读(294)  评论(0编辑  收藏  举报