Maruf_Hasan

Segment Tree

Mar 14th, 2020
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1.  
  2. /*If you want something you've never had, you have to do something you never did.*/
  3.  
  4. #include<bits/stdc++.h>
  5. using namespace std;
  6.  
  7.  
  8. #define pb push_back
  9. #define ll long long
  10. #define pii pair<ll,ll>
  11. #define pll pair<ll,ll>
  12. #define M 100007
  13. #define INF 1e9
  14. #define INFL 1e18
  15. #define PI acos(-1)
  16. #define mp make_pair
  17. #define fast_in_out ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  18. //const ll fx[]= {+1,-1,+0,+0};
  19. //const ll fy[]= {+0,+0,+1,-1};
  20. //const ll fx[]={+0,+0,+1,-1,-1,+1,-1,+1}; // Kings Move
  21. //const ll fy[]={-1,+1,+0,+0,+1,+1,-1,-1}; // Kings Move
  22. //const ll fx[]={-2, -2, -1, -1, 1, 1, 2, 2}; // Knights Move
  23. //const ll fy[]={-1, 1, -2, 2, -2, 2, -1, 1}; // Knights Move
  24.  
  25. ll tree[4*150000];
  26. ll arr[150100];
  27. ll n,m;
  28.  
  29.  
  30. ll mypow(ll x)
  31. {
  32. ll ans=1;
  33. while(x!=0)
  34. {
  35. ans=ans*2;
  36. x--;
  37. }
  38. return ans;
  39. }
  40. void init(ll node,ll b,ll e,ll flag)
  41. {
  42. if(b==e)
  43. {
  44. tree[node]=arr[b];
  45. return;
  46. }
  47. ll left=node*2;
  48. ll right=node*2+1;
  49. ll mid=(b+e)/2;
  50. init(left,b,mid,(flag+1)%2);
  51. init(right,mid+1,e,(flag+1)%2);
  52. if(flag==0)
  53. {
  54. tree[node]=(tree[left] | tree[right]);
  55. // cout<<node<<" "<<tree[node]<<" "<<flag<<endl;
  56. }
  57. else
  58. {
  59. tree[node]=(tree[left] ^ tree[right]);
  60. // cout<<node<<" "<<tree[node]<<" "<<flag<<endl;
  61. }
  62. }
  63.  
  64. void update(ll node,ll b,ll e,ll i,ll newvalue,ll flag)
  65. {
  66. if(i>e || i<b)
  67. return;
  68. if(b==e)
  69. {
  70. tree[node]=newvalue;
  71. return;
  72. }
  73. ll left=node*2;
  74. ll right=node*2+1;
  75. ll mid=(b+e)/2;
  76. update(left,b,mid,i,newvalue,(flag+1)%2);
  77. update(right,mid+1,e,i,newvalue,(flag+1)%2);
  78. if(flag==0)
  79. {
  80. tree[node]=(tree[left] | tree[right]);
  81. }
  82. else
  83. {
  84. tree[node]=(tree[left] ^ tree[right]);
  85. }
  86. }
  87.  
  88. int main()
  89. {
  90. fast_in_out;
  91. //freopen("input.txt","r",stdin);
  92. //freopen("output.txt","w",stdout);
  93. ll x;
  94. cin>>x>>m;
  95. n=mypow(x);
  96. for(ll i=1;i<=n;i++)
  97. {
  98. cin>>arr[i];
  99. }
  100. ll flag=0;
  101. if(x%2==0)
  102. flag=1;
  103. init(1,1,n,flag);
  104. // cout<<tree[1]<<endl;
  105. while(m--)
  106. {
  107.  
  108. ll p,b;
  109. cin>>p>>b;
  110. update(1,1,n,p,b,flag);
  111. cout<<tree[1]<<endl;
  112.  
  113. }
  114. return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment