Advertisement
Alex_tz307

DYNAMIC SEGMENT TREE FOR MEX - STATIC

May 21st, 2021 (edited)
642
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.52 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using int64 = long long;
  5.  
  6. const int MAXN = 1e5;
  7. const int LOG = 60;
  8. const int64 VMAX = 1e18L;
  9.  
  10. struct node {
  11.   int64 sum, l, r;
  12.   int lSon, rSon;
  13.   short lazy_set;
  14.   bool lazy_xor;
  15.   node() : sum(0), lSon(-1), rSon(-1), lazy_set(-1), lazy_xor(false) {}
  16. } tree[MAXN * LOG];
  17.  
  18. int nodes = 1;
  19.  
  20. void add_left(int x) {
  21.   int64 mid = (tree[x].l + tree[x].r) >> 1;
  22.   if (tree[x].lSon == -1) {
  23.     tree[x].lSon = ++nodes;
  24.     tree[nodes].l = tree[x].l;
  25.     tree[nodes].r = mid;
  26.   }
  27. }
  28.  
  29. void add_right(int x) {
  30.   int64 mid = (tree[x].l + tree[x].r) >> 1;
  31.   if (tree[x].rSon == -1) {
  32.     tree[x].rSon = ++nodes;
  33.     tree[nodes].l = mid + 1;
  34.     tree[nodes].r = tree[x].r;
  35.   }
  36. }
  37.  
  38. void propagate(int x) {
  39.   if (tree[x].lazy_set != -1) {
  40.     add_left(x);
  41.     int son = tree[x].lSon;
  42.     tree[son].sum = (tree[son].r - tree[son].l + 1) * tree[x].lazy_set;
  43.     tree[son].lazy_xor = 0;
  44.     tree[son].lazy_set = tree[x].lazy_set;
  45.     add_right(x);
  46.     son = tree[x].rSon;
  47.     tree[son].sum = (tree[son].r - tree[son].l + 1) * tree[x].lazy_set;
  48.     tree[son].lazy_xor = 0;
  49.     tree[son].lazy_set = tree[x].lazy_set;
  50.     tree[x].lazy_set = -1;
  51.   }
  52.   if (tree[x].lazy_xor) {
  53.     add_left(x);
  54.     int son = tree[x].lSon;
  55.     tree[son].sum = (tree[son].r - tree[son].l + 1) - tree[son].sum;
  56.     tree[son].lazy_xor ^= 1;
  57.     add_right(x);
  58.     son = tree[x].rSon;
  59.     tree[son].sum = (tree[son].r - tree[son].l + 1) - tree[son].sum;
  60.     tree[son].lazy_xor ^= 1;
  61.     tree[x].lazy_xor = 0;
  62.   }
  63. }
  64.  
  65. void update_sum(int x) {
  66.   tree[x].sum = 0;
  67.   if (tree[x].lSon != -1)
  68.     tree[x].sum += tree[tree[x].lSon].sum;
  69.   if (tree[x].rSon != -1)
  70.     tree[x].sum += tree[tree[x].rSon].sum;
  71. }
  72.  
  73. void range_set(int x, int64 st, int64 dr, bool val) {
  74.   if (st <= tree[x].l && tree[x].r <= dr) {
  75.     tree[x].sum = (tree[x].r - tree[x].l + 1) * val;
  76.     tree[x].lazy_xor = 0;
  77.     tree[x].lazy_set = val;
  78.     return;
  79.   }
  80.   propagate(x);
  81.   int64 mid = (tree[x].l + tree[x].r) >> 1;
  82.   if (st <= mid) {
  83.     add_left(x);
  84.     range_set(tree[x].lSon, st, dr, val);
  85.   }
  86.   if (mid < dr) {
  87.     add_right(x);
  88.     range_set(tree[x].rSon, st, dr, val);
  89.   }
  90.   update_sum(x);
  91. }
  92.  
  93. void range_xor(int x, int64 st, int64 dr) {
  94.   if (st <= tree[x].l && tree[x].r <= dr) {
  95.     tree[x].sum = (tree[x].r - tree[x].l + 1) - tree[x].sum;
  96.     tree[x].lazy_xor ^= 1;
  97.     return;
  98.   }
  99.   propagate(x);
  100.   int64 mid = (tree[x].l + tree[x].r) >> 1;
  101.   if (st <= mid) {
  102.     add_left(x);
  103.     range_xor(tree[x].lSon, st, dr);
  104.   }
  105.   if (mid < dr) {
  106.     add_right(x);
  107.     range_xor(tree[x].rSon, st, dr);
  108.   }
  109.   update_sum(x);
  110. }
  111.  
  112. int64 query(int x) {
  113.   if (tree[x].l == tree[x].r)
  114.     return tree[x].l;
  115.   propagate(x);
  116.   int64 mid = (tree[x].l + tree[x].r) >> 1;
  117.   add_left(x);
  118.   int son = tree[x].lSon;
  119.   if (tree[son].sum == 0)
  120.     return tree[son].l;
  121.   if (tree[son].sum < tree[son].r - tree[son].l + 1)
  122.     return query(son);
  123.   add_right(x);
  124.   son = tree[x].rSon;
  125.   if (tree[son].sum == 0)
  126.     return tree[son].l;
  127.   if (tree[son].sum < tree[son].r - tree[son].l + 1)
  128.     return query(son);
  129.   return VMAX + 1;
  130. }
  131.  
  132. int main() {
  133.   ios_base::sync_with_stdio(false);
  134.   cin.tie(nullptr);
  135.   cout.tie(nullptr);
  136.   int N;
  137.   cin >> N;
  138.   tree[1].sum = 0;
  139.   tree[1].l = 1;
  140.   tree[1].r = VMAX;
  141.   for (int i = 0; i < N; ++i) {
  142.     int t;
  143.     int64 l, r;
  144.     cin >> t >> l >> r;
  145.     if (t < 3)
  146.       range_set(1, l, r, (t == 1));
  147.     else range_xor(1, l, r);
  148.     cout << query(1) << '\n';
  149.   }
  150.   return 0;
  151. }
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement