Advertisement
pb_jiang

jly-LazySegmentTree

Feb 18th, 2023
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.32 KB | None | 0 0
  1. using i64 = long long;
  2.  
  3. template<class Info, class Tag>
  4. struct LazySegmentTree {
  5.     const int n;
  6.     std::vector<Info> info;
  7.     std::vector<Tag> tag;
  8.     LazySegmentTree(int n) : n(n), info(4 << std::__lg(n)), tag(4 << std::__lg(n)) {}
  9.     LazySegmentTree(std::vector<Info> init) : LazySegmentTree(init.size()) {
  10.         std::function<void(int, int, int)> build = [&](int p, int l, int r) {
  11.             if (r - l == 1) {
  12.                 info[p] = init[l];
  13.                 return;
  14.             }
  15.             int m = (l + r) / 2;
  16.             build(2 * p, l, m);
  17.             build(2 * p + 1, m, r);
  18.             pull(p);
  19.         };
  20.         build(1, 0, n);
  21.     }
  22.     void pull(int p) {
  23.         info[p] = info[2 * p] + info[2 * p + 1];
  24.     }
  25.     void apply(int p, const Tag &v) {
  26.         info[p].apply(v);
  27.         tag[p].apply(v);
  28.     }
  29.     void push(int p) {
  30.         apply(2 * p, tag[p]);
  31.         apply(2 * p + 1, tag[p]);
  32.         tag[p] = Tag();
  33.     }
  34.     void modify(int p, int l, int r, int x, const Info &v) {
  35.         if (r - l == 1) {
  36.             info[p] = v;
  37.             return;
  38.         }
  39.         int m = (l + r) / 2;
  40.         push(p);
  41.         if (x < m) {
  42.             modify(2 * p, l, m, x, v);
  43.         } else {
  44.             modify(2 * p + 1, m, r, x, v);
  45.         }
  46.         pull(p);
  47.     }
  48.     void modify(int p, const Info &v) {
  49.         modify(1, 0, n, p, v);
  50.     }
  51.     Info rangeQuery(int p, int l, int r, int x, int y) {
  52.         if (l >= y || r <= x) {
  53.             return Info();
  54.         }
  55.         if (l >= x && r <= y) {
  56.             return info[p];
  57.         }
  58.         int m = (l + r) / 2;
  59.         push(p);
  60.         return rangeQuery(2 * p, l, m, x, y) + rangeQuery(2 * p + 1, m, r, x, y);
  61.     }
  62.     Info rangeQuery(int l, int r) {
  63.         return rangeQuery(1, 0, n, l, r);
  64.     }
  65.     void rangeApply(int p, int l, int r, int x, int y, const Tag &v) {
  66.         if (l >= y || r <= x) {
  67.             return;
  68.         }
  69.         if (l >= x && r <= y) {
  70.             apply(p, v);
  71.             return;
  72.         }
  73.         int m = (l + r) / 2;
  74.         push(p);
  75.         rangeApply(2 * p, l, m, x, y, v);
  76.         rangeApply(2 * p + 1, m, r, x, y, v);
  77.         pull(p);
  78.     }
  79.     void rangeApply(int l, int r, const Tag &v) {
  80.         return rangeApply(1, 0, n, l, r, v);
  81.     }
  82.    
  83.     int search(int p, int l, int r, int x, int y, i64 v) {
  84.         if (l >= y || r <= x) return y;
  85.         if (info[p].min >= v) return y;
  86.         if (r - l == 1) return l;
  87.         int m = (l + r) / 2;
  88.         push(p);
  89.         int res = search(2 * p, l, m, x, y, v);
  90.         if (res == y) res = search(2 * p + 1, m, r, x, y, v);
  91.         return res;
  92.     }
  93.    
  94.     int search(int l, int r, i64 v) {
  95.         return search(1, 0, n, l, r, v);
  96.     }
  97. };
  98.  
  99. constexpr i64 inf = 1E18;
  100.  
  101. struct Tag {
  102.     int rev;
  103.  
  104.     Tag(int _rev = 0) : rev{_rev} {}
  105.    
  106.     void apply(const Tag &t) {
  107.         if (t.rev) {
  108.             rev ^= 1;
  109.         }
  110.     }
  111. };
  112.  
  113. struct Info {
  114.     int up;
  115.     int down;
  116.  
  117.     Info() : up{0}, down{0} {}
  118.     Info(int _up, int _down) : up{_up}, down{_down} {}
  119.    
  120.     void apply(const Tag &t) {
  121.         if (t.rev) {
  122.             swap(up, down);
  123.         }
  124.     }
  125. };
  126.  
  127. Info operator+(const Info &a, const Info &b) {
  128.     Info c;
  129.     c.up = a.up + b.up;
  130.     c.down = a.down + b.down;
  131.     return c;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement