Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. struct node {
  2.     int mn, mx;
  3.     node() : mn(mod), mx(-mod) {}
  4.     node(int x) : mn(x), mx(x) {}
  5.     node(int _mn, int _mx) : mn(_mn), mx(_mx) {}
  6.     int get() const {
  7.         return mx - mn;
  8.     }
  9. };
  10.  
  11. inline node merge(const node &a, const node &b) {
  12.     return node(min(a.mn, b.mn), max(a.mx, b.mx));
  13. }
  14.  
  15. template<class node>
  16. class Tree {
  17. private:
  18.     node *t = nullptr;
  19.     int n;
  20.  
  21. public:
  22.     ~Tree() {
  23.         delete [] t;
  24.     }
  25.     void resize(int sz) {
  26.         n = 1;
  27.         while (sz > n) n *= 2;
  28.         t = new node[2 * n + 1];
  29.     }
  30.     template<class T>
  31.     void assign(const vector<T> &a) {
  32.         resize(sz(a));
  33.         for (int i = 0; i < sz(a); ++i)
  34.             t[i + n] = a[i];
  35.         for (int i = sz(a); i < n; ++i)
  36.             t[i + n] = node();
  37.         for (int i = n - 1; i > 0; --i)
  38.             t[i] = merge(t[i + i], t[i + i + 1]);
  39.     }
  40.     template<class T>
  41.     Tree(const vector<T> &a) {
  42.         assign(a);
  43.     }
  44.     Tree(int sz, node x = node()) {
  45.         resize(sz);
  46.         for (int i = 0; i < n; ++i)
  47.             t[i + n] = x;
  48.         for (int i = n - 1; i >= 0; --i)
  49.             t[i] = merge(t[i + i], t[i + i + 1]);
  50.     }
  51.     void updup(int r, node x) { //upd r-th element with x (w/o push)
  52.         r += n;
  53.         t[r] = x;
  54.         for (r >>= 1; r > 1; r >>= 1)
  55.             t[r] = merge(t[r + r], t[r + r + 1]);
  56.     }
  57.     node getup(int l, int r) { //get on [l, r] (w/o push)
  58.         l += n;
  59.         r += n + 1;
  60.         node left = node(), right = node();
  61.         for (; l < r; l >>= 1, r >>= 1) {
  62.             if (l & 1) left = merge(left, t[l++]);
  63.             if (r & 1) right = merge(t[--r], right);
  64.         }
  65.         return merge(left, right);
  66.     }
  67.     node get(int l, int r) {
  68.         return t[0].push();
  69.     }
  70. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement