Advertisement
Alex_tz307

DYNAMIC SEGMENT TREE FOR MEX

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