didedoshka

lazy_segtree

Dec 11th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. struct segtree {
  2.     struct node {
  3.         int val;
  4.         int prop;
  5.  
  6.         node() {
  7.             val = 0;
  8.             prop = 0;
  9.         }
  10.     };
  11.  
  12.     int size;
  13.     vector<node> tree;
  14.  
  15.     segtree(int n) {
  16.         size = 1;
  17.         while (size < n) {
  18.             size *= 2;
  19.         }
  20.         tree.resize(2 * size - 1);
  21.     }
  22.  
  23.     void propagate(int x) {
  24.         if (x > size - 2) {
  25.             return;
  26.         } else {
  27.             tree[2 * x + 1].prop += tree[x].prop;
  28.             tree[2 * x + 2].prop += tree[x].prop;
  29.             tree[2 * x + 1].val += tree[x].prop;
  30.             tree[2 * x + 2].val += tree[x].prop;
  31.  
  32.             tree[x].prop = 0;
  33.         }
  34.     }
  35.  
  36.     void set(int l, int r, int v, int x, int lx, int rx) {
  37.         if (rx <= l || r <= lx) {
  38.             return;
  39.         }
  40.         propagate(x);
  41.         if (l <= lx && rx <= r) {
  42.             tree[x].prop += v;
  43.             tree[x].val += v;
  44.             return;
  45.         }
  46.         int m = (lx + rx) / 2;
  47.         set(l, r, v, 2 * x + 1, lx, m);
  48.         set(l, r, v, 2 * x + 2, m, rx);
  49.         tree[x].val = min(tree[2 * x + 1].val, tree[2 * x + 2].val);
  50.     }
  51.  
  52.     void set(int l, int r, int v) {
  53.         set(l, r, v, 0, 0, size);
  54.     }
  55.  
  56.     int get(int l, int r, int x, int lx, int rx) {
  57.         if (rx <= l || r <= lx) {
  58.             return INT64_MAX;
  59.         }
  60.         propagate(x);
  61.         if (l <= lx && rx <= r) {
  62.             return tree[x].val;
  63.         }
  64.         int m = (lx + rx) / 2;
  65.         int v1 = get(l, r, 2 * x + 1, lx, m);
  66.         int v2 = get(l, r, 2 * x + 2, m, rx);
  67.         return min(v1, v2);
  68.     }
  69.  
  70.     int get(int l, int r) {
  71.         return get(l, r, 0, 0, size);
  72.     }
  73. };
Advertisement
Add Comment
Please, Sign In to add comment