Snapper_001

Untitled

Jun 17th, 2023
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. struct segTree{
  2. ll size;
  3. vector<ll>tree;
  4. vector<ll>lazy;
  5.  
  6. void init(ll n){
  7. tree.clear();
  8. size =1;
  9. while(size<n){
  10. size*=2;
  11. }
  12. tree.assign(2*size , 0);
  13. lazy.assign(2*size , -1);
  14. }
  15.  
  16. //Node x : [lx rx] -->answer for this range
  17.  
  18. void update(ll x ,ll lx ,ll rx , ll q_lx ,ll q_rx){
  19. if(q_lx <= lx && rx<=q_rx){
  20. if(lazy[x]==-1) lazy[x] = 1;
  21. else lazy[x]++;
  22.  
  23. if(lazy[x]&1){
  24. tree[x] = (rx-lx+1) - tree[x];
  25. }
  26.  
  27. if(rx!=lx){
  28. //push_downward
  29. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  30. else lazy[2*x] = lazy[x];
  31. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  32. else lazy[2*x+1] = lazy[x];
  33. }
  34. lazy[x] = -1;
  35. return;
  36. }
  37.  
  38. if(q_lx > rx || q_rx < lx) return;
  39.  
  40. if(lazy[x]!=-1){
  41. //push the information that you toggle your bits
  42. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  43. else lazy[2*x] = lazy[x];
  44. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  45. else lazy[2*x+1] = lazy[x];
  46. lazy[x] = -1;
  47. }
  48.  
  49. ll mid = (lx +rx)>>1;
  50. update(2*x , lx , mid , q_lx , q_rx );
  51. update(2*x+1 , mid+1 , rx , q_lx , q_rx );
  52. tree[x] = tree[2*x] + tree[2*x+1];
  53. }
  54.  
  55. void update(ll q_lx , ll q_rx){
  56. update(1 , 0 , size-1 , q_lx , q_rx);
  57. }
  58.  
  59. ll query(ll x ,ll lx ,ll rx , ll q_lx , ll q_rx){
  60. if(q_lx <= lx && rx<=q_rx){
  61. if(lazy[x]!=-1 && lazy[x]&1){
  62. tree[x] = (rx-lx+1) - tree[x];
  63. }
  64. if(rx!=lx){
  65. //push_downward
  66. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  67. else lazy[2*x] = lazy[x];
  68. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  69. else lazy[2*x+1] = lazy[x];
  70. }
  71. lazy[x] = -1;
  72. return tree[x];
  73. }
  74.  
  75. if(q_lx > rx || q_rx < lx) return 0;
  76.  
  77. if(lazy[x]!=-1){
  78. //push the information that you toggle your bits
  79. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  80. else lazy[2*x] = lazy[x];
  81. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  82. else lazy[2*x+1] = lazy[x];
  83. lazy[x] = -1;
  84. }
  85.  
  86. ll mid = (lx +rx)>>1;
  87.  
  88. return query(2*x , lx , mid , q_lx , q_rx ) +
  89. query(2*x+1 , mid+1 , rx , q_lx , q_rx );
  90.  
  91. }
  92.  
  93. ll query(ll q_lx , ll q_rx){
  94. return query(1 , 0 , size-1 , q_lx , q_rx);
  95. }
  96.  
  97. };
  98.  
  99. vector<int> binaryQueries(int n, vector<int> &a, int q, vector<vector<int>> &queries) {
  100. //[l ,r ,x]
  101. //bitwise or we want to find
  102. //seg tree with an array of 30
  103.  
  104. vector<segTree>st(31);
  105. for(ll i=0;i<31;i++){
  106. st[i].init(n+1);
  107. for(int j=0;j<n;j++){
  108. if(a[j]&(1ll<<i)){
  109. st[i].tree[st[i].size+j] = 1;
  110. }
  111. }
  112.  
  113. for(int j= st[i].size-1;j>=1;j--){
  114. st[i].tree[j] = st[i].tree[2*j] + st[i].tree[2*j + 1];
  115. }
  116. }
  117.  
  118. //check for segTree
  119.  
  120. vector<int>Ans;
  121. ll ind =0;
  122. for(auto it : queries){
  123. ll l, r , x;
  124. l = it[0];
  125. r = it[1];
  126. x = it[2];
  127.  
  128. for(ll j=0;j<31;j++){
  129. if(x&(1ll<<j)){
  130. st[j].update(l ,r);
  131. }
  132. }
  133.  
  134. ll ans =0;
  135. for(ll j=0;j<31;j++){
  136. if(st[j].query(l ,r)){
  137. ans += (1ll<<j);
  138. }
  139. }
  140. Ans.push_back(ans);
  141. }
  142. return Ans;
  143. }
  144.  
  145.  
Advertisement
Add Comment
Please, Sign In to add comment