Snapper_001

Untitled

Jun 17th, 2023
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 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){
  39. if(lazy[x]!=-1 && (lazy[x]&1)){
  40. tree[x] = (rx-lx+1) - tree[x];
  41. }
  42. if(lazy[x]!=-1 && rx!=lx){
  43. //push_downward
  44. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  45. else lazy[2*x] = lazy[x];
  46. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  47. else lazy[2*x+1] = lazy[x];
  48. }
  49. lazy[x] = -1;
  50. return;
  51. }
  52.  
  53. if(lazy[x]!=-1){
  54. //push the information that you toggle your bits
  55. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  56. else lazy[2*x] = lazy[x];
  57. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  58. else lazy[2*x+1] = lazy[x];
  59. lazy[x] = -1;
  60. }
  61.  
  62. ll mid = (lx +rx)>>1;
  63. update(2*x , lx , mid , q_lx , q_rx );
  64. update(2*x+1 , mid+1 , rx , q_lx , q_rx );
  65. tree[x] = tree[2*x] + tree[2*x+1];
  66. }
  67.  
  68. void update(ll q_lx , ll q_rx){
  69. update(1 , 0 , size-1 , q_lx , q_rx);
  70. }
  71.  
  72. ll query(ll x ,ll lx ,ll rx , ll q_lx , ll q_rx){
  73. if(q_lx <= lx && rx<=q_rx){
  74. if(lazy[x]!=-1 && (lazy[x]&1)){
  75. tree[x] = (rx-lx+1) - tree[x];
  76. }
  77. if(lazy[x]!=-1 && rx!=lx){
  78. //push_downward
  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. }
  84. lazy[x] = -1;
  85. return tree[x];
  86. }
  87.  
  88. if(q_lx > rx || q_rx < lx){
  89. if(lazy[x]!=-1 && (lazy[x]&1)){
  90. tree[x] = (rx-lx+1) - tree[x];
  91. }
  92. if(lazy[x]!=-1 && rx!=lx){
  93. //push_downward
  94. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  95. else lazy[2*x] = lazy[x];
  96. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  97. else lazy[2*x+1] = lazy[x];
  98. }
  99. lazy[x] = -1;
  100. return 0;
  101. }
  102.  
  103. if(lazy[x]!=-1){
  104. //push the information that you toggle your bits
  105. if(lazy[2*x]!=-1) lazy[2*x] += lazy[x];
  106. else lazy[2*x] = lazy[x];
  107. if(lazy[2*x+1]!=-1) lazy[2*x+1] += lazy[x];
  108. else lazy[2*x+1] = lazy[x];
  109. lazy[x] = -1;
  110. }
  111.  
  112. ll mid = (lx +rx)>>1;
  113.  
  114. ll val1 = query(2*x , lx , mid , q_lx , q_rx );
  115. ll val2 = query(2*x+1 , mid+1 , rx , q_lx , q_rx );
  116. tree[x] = tree[2*x] + tree[2*x+1];
  117. return val1 + val2;
  118. }
  119.  
  120. ll query(ll q_lx , ll q_rx){
  121. return query(1 , 0 , size-1 , q_lx , q_rx);
  122. }
  123.  
  124. };
Advertisement
Add Comment
Please, Sign In to add comment