Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 100009
  4. int n, q;
  5. int tree0[4*N], tree1[4*N], lazy[4*N];
  6.  
  7. void build(int node, int s, int e)
  8. {
  9.     if(s == e)
  10.     {
  11.         tree0[node] = 1;
  12.         return;
  13.     }
  14.  
  15.     int left = 2*node + 1, right = 2*node + 2, mid = (s+e)>>1;
  16.     build(left, s, mid);
  17.     build(right, mid+1, e);
  18.  
  19.     tree0[node] = tree0[left] + tree0[right];
  20. }
  21.  
  22. void update(int node, int s, int e, int l, int r)
  23. {
  24.     if(s > r || e < l)
  25.         return;
  26.  
  27.     int temp, left = 2*node + 1, right = 2*node + 2, mid = (s+e)>>1;
  28.  
  29.     if(lazy[node])
  30.     {
  31.         if(s != e)
  32.         {
  33.             lazy[left] = (lazy[left] + lazy[node])%3;
  34.             lazy[right] = (lazy[right] + lazy[node])%3;
  35.         }
  36.  
  37.         while(lazy[node]--)
  38.         {
  39.             temp = tree1[node];
  40.             tree1[node] = tree0[node];
  41.             tree0[node] = (e-s+1) - temp - tree0[node];
  42.         }
  43.     }
  44.     if(s >= l && e <= r)
  45.     {
  46.         temp = tree1[node];
  47.         tree1[node] = tree0[node];
  48.         tree0[node] = (e-s+1) - temp - tree0[node];
  49.  
  50.         if(s != e)
  51.         {
  52.             lazy[left] = (lazy[left] + 1)%3;
  53.             lazy[right] = (lazy[right] + 1)%3;
  54.         }
  55.         return;
  56.     }
  57.  
  58.     update(left, s, mid, l, r);
  59.     update(right, mid+1, e, l, r);
  60.  
  61.     tree0[node] = tree0[left] + tree0[right];
  62.     tree1[node] = tree1[left] + tree1[right];
  63. }
  64.  
  65. int query(int node, int s, int e, int l, int r)
  66. {
  67.     if(s > r || e < l)
  68.         return 0;
  69.  
  70.     int temp, left = 2*node + 1, right = 2*node + 2, mid = (s+e)>>1;
  71.  
  72.     if(lazy[node])
  73.     {
  74.         if(s != e)
  75.         {
  76.             lazy[left] = (lazy[left] + lazy[node])%3;
  77.             lazy[right] = (lazy[right] + lazy[node])%3;
  78.         }
  79.  
  80.         while(lazy[node]--)
  81.         {
  82.             temp = tree1[node];
  83.             tree1[node] = tree0[node];
  84.             tree0[node] = (e-s+1) - temp - tree0[node];
  85.         }
  86.     }
  87.  
  88.     if(s >= l && e <= r)
  89.         return tree0[node];
  90.  
  91.     int p1 = query(left, s, mid, l, r);
  92.     int p2 = query(right, mid+1, e, l, r);
  93.  
  94.     return p1 + p2;
  95. }
  96.  
  97. int main()
  98. {
  99.     int type, l, r;
  100.     cin >> n >> q;
  101.     build(0, 0, n-1);
  102.     while(q--)
  103.     {
  104.         cin >> type >> l >> r;
  105.         if(!type)
  106.         {
  107.             update(0, 0, n-1, l, r);
  108. //            for(int i = 0; i < 4*n; i++)
  109. //                cout << tree0[i] << " ";
  110. //            cout << endl;
  111. //            for(int i = 0; i < 4*n; i++)
  112. //                cout << tree1[i] << " ";
  113. //            cout << endl;
  114. //            for(int i = 0; i < 4*n; i++)
  115. //                cout << lazy[i] << " ";
  116. //            cout << endl;
  117.         }
  118.         else
  119.         {
  120.             cout << query(0, 0, n-1, l, r) << endl;
  121.         }
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement