Advertisement
welleyth

Cool segment tree

Feb 4th, 2022
838
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6. #define int long long
  7. #define pb push_back
  8. #define mp make_pair
  9.  
  10. #pragma GCC optimize("Ofast")
  11. #pragma GCC optimize("unroll-loops")
  12.  
  13. const int N = (int)5e5+111;
  14.  
  15. int n;
  16. int t[2][4*N];
  17. int w[2][4*N];
  18. int a[2][N];
  19. int sz[2];
  20.  
  21. void build(int v,int l,int r,int T){
  22.     if(l == r){
  23.         t[T][v] = a[T][l];
  24.         return;
  25.     }
  26.     int m = (l+r)>>1;
  27.     build(v<<1,l,m,T);
  28.     build(v<<1|1,m+1,r,T);
  29.     t[T][v] = t[T][v<<1] + t[T][v<<1|1];
  30.     return;
  31. }
  32.  
  33. void push(int v,int l,int r,int T){
  34.     if(w[T][v] == 0)
  35.         return;
  36.     int m = (l+r)>>1;
  37.     t[T][v<<1] = m-l+1-t[T][v<<1];
  38.     t[T][v<<1|1] = r-m-t[T][v<<1|1];
  39.     w[T][v<<1] ^= 1;
  40.     w[T][v<<1|1] ^= 1;
  41.     w[T][v] = 0;
  42.     return;
  43. }
  44.  
  45. int get(int v,int l,int r,int tl,int tr,int T){
  46.     if(l > r || tl > tr)
  47.         return 0;
  48.     if(l == tl && r == tr)
  49.         return t[T][v];
  50.     push(v,l,r,T);
  51.     int m = (l+r)>>1;
  52.     return get(v<<1,l,m,tl,min(tr,m),T)
  53.         +  get(v<<1|1,m+1,r,max(tl,m+1),tr,T);
  54. }
  55.  
  56. void upd(int v,int l,int r,int tl,int tr,int T){
  57.     if(l > r || tl > tr)
  58.         return;
  59.     if(l == tl && r == tr){
  60.         t[T][v] = r-l+1 - t[T][v];
  61.         w[T][v] ^= 1;
  62.         return;
  63.     }
  64.     push(v,l,r,T);
  65.     int m = (l+r)>>1;
  66.     upd(v<<1,l,m,tl,min(m,tr),T);
  67.     upd(v<<1|1,m+1,r,max(tl,m+1),tr,T);
  68.     t[T][v] = t[T][v<<1] + t[T][v<<1|1];
  69.     return;
  70. }
  71.  
  72. int get(int l,int r,int T){
  73.     return get(1,1,sz[T],l,r,T);
  74. }
  75.  
  76. void upd(int l,int r,int T){
  77.     upd(1,1,sz[T],l,r,T);
  78.     return;
  79. }
  80.  
  81. int get0(int l,int r){
  82.     if(l % 2 == 1)
  83.         l++;
  84.     if(r % 2 == 1)
  85.         r--;
  86.     if(l > r)
  87.         return 0;
  88.     l = (l+1)/2;
  89.     r = (r+1)/2;
  90.     return get(l,r,0);
  91. }
  92.  
  93. int get1(int l,int r){
  94.     if(l % 2 == 0)
  95.         l++;
  96.     if(r % 2 == 0)
  97.         r--;
  98.     if(l > r)
  99.         return 0;
  100.     l = (l+1)/2;
  101.     r = (r+1)/2;
  102.     return get(l,r,1);
  103. }
  104.  
  105. int get(int l,int r){
  106.     return get0(l,r) + get1(l,r);
  107. }
  108.  
  109. void upd0(int l,int r){
  110.     if(l % 2 == 1)
  111.         l++;
  112.     if(r % 2 == 1)
  113.         r--;
  114.     if(l > r)
  115.         return;
  116.     l = (l+1)/2;
  117.     r = (r+1)/2;
  118.     upd(l,r,0);
  119.     return;
  120. }
  121. void upd1(int l,int r){
  122.     if(l % 2 == 0)
  123.         l++;
  124.     if(r % 2 == 0)
  125.         r--;
  126.     if(l > r)
  127.         return;
  128.     l = (l+1)/2;
  129.     r = (r+1)/2;
  130. //    cerr << "upd1: l,r = " << l << " " << r << "\n";
  131.     upd(l,r,1);
  132.     return;
  133. }
  134.  
  135. void upd(int l,int r){
  136.     if(l % 2 == 1)
  137.         upd1(l,r);
  138.     else
  139.         upd0(l,r);
  140.     return;
  141. }
  142.  
  143. void solve(){
  144.     int q;
  145.     cin >> n >> q;
  146.  
  147.     for(int i = 1; i <= n; i++){
  148.         int x;
  149.         cin >> x;
  150.         a[i%2][++sz[i%2]] = x;
  151.     }
  152.  
  153.     build(1,1,sz[0],0);
  154.     build(1,1,sz[1],1);
  155.  
  156.     while(q--){
  157.         int tp,l,r;
  158.         cin >> tp >> l >> r;
  159.         if(tp == 1){
  160.             upd(l,r);
  161.         } else {
  162. //            cout << "ANS = ";
  163.             cout << get(l,r) << "\n";
  164.         }
  165. //        cerr << "A = ";
  166. //        cerr << get(1,1) << " ";
  167. //        cerr << get(2,2) << " ";
  168. //        cerr << get(3,3) << "\n";
  169. //        cerr << get(1,1,sz[1],1,1,1) << " ";
  170. //        cerr << get(1,1,sz[0],1,1,0) << " ";
  171. //        cerr << get(1,1,sz[1],2,2,1) << "\n";
  172.     }
  173.  
  174.     return;
  175. }
  176. signed main(){
  177.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  178.     int tests = 1;
  179. //    cin >> tests;
  180.     while(tests--){
  181.         solve();
  182.     }
  183. }
  184. /**
  185. 1 1 2 2 3 3 4 4 5 5 6 6
  186. 1 2 3 4 5 6 7 8 9 10 11
  187.  
  188. 2*k-1
  189.  
  190. 10
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200. 1 4 2 8 7 6 9 5 3
  201.  
  202.  
  203. 5 10 27
  204. 4 5 25
  205. 2 8 14
  206. 1 7 3
  207. 7 8 20
  208. 6 1 3
  209. 5 9 28
  210. 3 6 11
  211. 8 10 32
  212.  
  213. 3 4 20
  214. 9 10 3
  215. 2 7 31
  216. 5 7 14
  217. 8 9 2
  218. 2 8 6
  219. 6 7 25
  220. 4 9 10
  221. 1 8 23
  222.  
  223. **/
  224.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement