fork download
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. long long build(long long* tree,int i,int tl,int tr,int* a,int op)
  6. {
  7. if(tl==tr)
  8. {
  9. tree[i]=a[tl];
  10. return tree[i];
  11. }
  12. int m=(tl+tr)/2;
  13.  
  14. //changed here
  15. tree[2*i+1]=build(tree,2*i+1,tl,m,a,!op);
  16. tree[2*i+2]=build(tree,2*i+2,m+1,tr,a,!op);
  17.  
  18. if(op==1)
  19. tree[i] = tree[2*i+1]|tree[2*i+2];
  20. else
  21. tree[i] = tree[2*i+1]^tree[2*i+2];
  22. return tree[i];
  23.  
  24. }
  25.  
  26.  
  27.  
  28. long long update(long long* tree,int i,int tl,int tr,int l,int* a,int op)
  29. {
  30. if(tl==tr && tl==l)
  31. {
  32. tree[i]=a[l];
  33. return tree[i];
  34. }
  35. if(l<tl || l>tr)
  36. {
  37. return tree[i];
  38. }
  39. int m=(tl+tr)/2;
  40. //changed here
  41. tree[2*i+1]=update(tree,2*i+1,tl,m,l,a,!op);
  42. tree[2*i+2]=update(tree,2*i+2,m+1,tr,l,a,!op);
  43. if(op==1)
  44. tree[i] = tree[2*i+1] | tree[2*i+2];
  45. else
  46. tree[i] = tree[2*i+1] ^ tree[2*i+2];
  47. return tree[i];
  48. }
  49.  
  50.  
  51. int main()
  52. {
  53. int n,q; cin >> n>>q;
  54. int s=pow(2,n);
  55. int a[s];
  56. for(int i=0;i<s;i++) cin >> a[i];
  57. //height of tree
  58. int x = (int)(ceil(log2(s)));
  59. long long tree[4*s];
  60. int op;
  61. if(x%2==0)
  62. {
  63. op=0;
  64. }
  65. else op=1;
  66. build(tree,0,0,s-1,a,op);
  67.  
  68.  
  69.  
  70.  
  71. while(q--)
  72. {
  73.  
  74. int l,v; cin >> l>> v;
  75. l--;
  76. a[l]=v;
  77. long long stree=update(tree,0,0,s-1,l,a,op);
  78.  
  79. cout << stree << endl;
  80.  
  81.  
  82. }
  83.  
  84. return 0;
  85. }
  86.  
Success #stdin #stdout 0.01s 5304KB
stdin
Standard input is empty
stdout
Standard output is empty