DuongNhi99

LITES (Segment Tree)

Mar 10th, 2022
541
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5;
  5.  
  6. int n;
  7. int st[4 * N], com[4 * N];
  8.  
  9. void update(int x, int y, int id, int l, int r)
  10. {
  11.     if (r <= l || r <= x || y <= l) return;
  12.    
  13.     if (x <= l && r <= y) {
  14.         ++com[id];
  15.         st[id] = r-l-st[id];
  16.     }
  17.     else {
  18.         int mid = (l+r) / 2;
  19.         update(x, y, 2*id+1, l, mid);
  20.         update(x, y, 2*id+2, mid, r);
  21.        
  22.         st[id] = st[2*id+1] + st[2*id+2];
  23.        
  24.         if (com[id] % 2 == 1)
  25.             st[id] = r-l-st[id];
  26.     }
  27. }
  28.  
  29. int get(int x, int y, int id, int l, int r)
  30. {
  31.     if(r <= l || r <= x || y <= l)
  32.         return 0;
  33.     if(x <= l && r <= y)
  34.         return st[id];
  35.    
  36.     int mid = (l+r) / 2;
  37.     int res = get(x, y, 2*id+1, l, mid) + get(x, y, 2*id+2, mid, r);
  38.    
  39.     return com[id] % 2 == 0 ? res : min(r, y) - max(l, x) - res;
  40. }
  41.  
  42. int main()
  43. {
  44.     int q; cin >> n >> q;
  45.    
  46.     while (q-- > 0) {
  47.         int t, x, y;
  48.         cin >> t >> x >> y;
  49.        
  50.         if (t == 0)
  51.             update(x-1, y, 0, 0, n);
  52.         else {
  53.             cout << get(x-1, y, 0, 0, n);
  54.             cout << '\n';
  55.         }
  56.     }
  57.    
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment