Advertisement
Guest User

Untitled

a guest
Feb 20th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. mt19937 rng((int) chrono::steady_clock::now().time_since_epoch().count());
  2.  
  3. template<typename T> struct treap {
  4.     struct node {
  5.         node *l, *r;
  6.         int p, sz;
  7.         T val, sub, lazy;
  8.         bool rev;
  9.         node(T v) : l(NULL), r(NULL), p(rng()), sz(1), val(v), sub(v), lazy(0), rev(0) {}
  10.         void prop() {
  11.             if (lazy) {
  12.                 val += lazy, sub += lazy*sz;
  13.                 if (l) l->lazy += lazy;
  14.                 if (r) r->lazy += lazy;
  15.             }
  16.             if (rev) {
  17.                 swap(l, r);
  18.                 if (l) l->rev ^= 1;
  19.                 if (r) r->rev ^= 1;
  20.             }
  21.             lazy = 0, rev = 0;
  22.         }
  23.         void update() {
  24.             sz = 1, sub = val;
  25.             if (l) sz += l->sz, sub += l->sub;
  26.             if (r) sz += r->sz, sub += r->sub;
  27.         }
  28.     };
  29.  
  30.     node* root;
  31.  
  32.     treap() { root = NULL; }
  33.     ~treap() {
  34.         vector<node*> q = {root};
  35.         while (q.size()) {
  36.             node* x = q.back(); q.pop_back();
  37.             if (!x) continue;
  38.             q.push_back(x->l), q.push_back(x->r);
  39.             delete x;
  40.         }
  41.     }
  42.  
  43.     int size(node* x) { return x ? x->sz : 0; }
  44.     int size() { return size(root); }
  45.     void join(node* l, node* r, node*& i) { // assume que l < r
  46.         if (!l or !r) return void(i = l ? l : r);
  47.         l->prop(), r->prop();
  48.         if (l->p > r->p) join(l->r, r, l->r), i = l;
  49.         else join(l, r->l, r->l), i = r;
  50.         i->update();
  51.     }
  52.     void split(node* i, node*& l, node*& r, int v, int key = 0) {
  53.         if (!i) return void(r = l = NULL);
  54.         i->prop();
  55.         if (key + size(i->l) < v) split(i->r, i->r, r, v, key+size(i->l)+1), l = i;
  56.         else split(i->l, l, i->l, v, key), r = i;
  57.         i->update();
  58.     }
  59.     void push_back(T v) {
  60.         node* i = new node(v);
  61.         join(root, i, root);
  62.     }
  63.     T query(int l, int r) {
  64.         node *L, *M, *R;
  65.         split(root, M, R, r+1), split(M, L, M, l);
  66.         T ans = M->val;
  67.         join(L, M, M), join(M, R, root);
  68.         return ans;
  69.     }
  70.     void update(int l, int r, T s) {
  71.         node *L, *M, *R;
  72.         split(root, M, R, r+1), split(M, L, M, l);
  73.         M->lazy += s;
  74.         join(L, M, M), join(M, R, root);
  75.     }
  76.     void reverse(int l, int r) {
  77.         node *L, *M, *R;
  78.         split(root, M, R, r+1), split(M, L, M, l);
  79.         M->rev ^= 1;
  80.         join(L, M, M), join(M, R, root);
  81.     }
  82. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement