Advertisement
Guest User

RMQ

a guest
Mar 31st, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. struct SegTree {
  2.     int n;
  3.     vector<int> a;
  4.     vector<int> tree, add;
  5.  
  6.     SegTree(int n) {
  7.         this->n = n;
  8.         tree.resize(4 * n, 0);
  9.         add.resize(4 * n, -1);
  10.         a.resize(n, 0);
  11.         build(0, 0, n);
  12.     }
  13.  
  14.     void push(int v, int l, int r) {
  15.         if (add[v] != -1 && l + 1 != r) {
  16.             tree[v] = add[v];
  17.             add[2 * v + 1] = add[v];
  18.             add[2 * v + 2] = add[v];
  19.             add[v] = -1;
  20.         }
  21.     }
  22.  
  23.     void build(int i, int l, int r) {
  24.         add[i] = -1;
  25.         if (l + 1 == r) {
  26.             //tree[i] = a[l];
  27.             tree[i] = 0;
  28.         } else {
  29.             int m = (l + r) / 2;
  30.             build(2 * i + 1, l, m);
  31.             build(2 * i + 2, m, r);
  32.             tree[i] = (tree[i * 2 + 1] | tree[i * 2 + 2]);
  33.         }
  34.     }
  35.  
  36.     void _update(int i, int l, int r, int ql, int qr, int val) {
  37.         if (qr <= l || ql >= r) {
  38.             return;
  39.         }
  40.         if (ql <= l && qr >= r) {
  41.             add[i] = val;
  42.             push(i, l, r);
  43.         } else {
  44.             int m = (l + r) / 2;
  45.             push(i, l, r);
  46.             _update(i * 2 + 1, l, m, ql, qr, val);
  47.             _update(i * 2 + 2, m, r, ql, qr, val);
  48.             tree[i] = (tree[2 * i + 1] | tree[2 * i + 2]);
  49.         }
  50.     }
  51.  
  52.     int _get(int i, int l, int r, int ql, int qr) {
  53.         if (qr <= l || ql >= r) {
  54.             return 0;
  55.         }
  56.         push(i, l, r);
  57.         if (ql <= l && qr >= r) {
  58.             return tree[i];
  59.         }
  60.         int m = (l + r) / 2;
  61.         return (_get(2 * i + 1, l, m, ql, qr) | _get(2 * i + 2, m, r, ql, qr));
  62.     }
  63.  
  64.     int get(int ql, int qr) {
  65.         return _get(0, 0, n, ql, qr);
  66.     }
  67.  
  68.     void update(int ql, int qr, int val) {
  69.         _update(0, 0, n, ql, qr, val);
  70.     }
  71. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement