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

 

 

 

你可能感兴趣的:(Opera)