Advertisement
mrlolthe1st

TreapImplictKey

Nov 17th, 2021
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1.  
  2. template<typename T>
  3. struct item {
  4.     int prior, c = 0;
  5.     T key;
  6.     item* l, * r;
  7.     item(T key, int prior) : key(key), prior(prior), l(NULL), r(NULL) { }
  8. };
  9.  
  10. template<typename T>
  11. struct dyn_array {
  12.     item<T>* treap = 0;
  13.     void upd(item<T>* x) {
  14.         x->c = (x->l ? x->l->c : 0) + 1 + (x->r ? x->r->c : 0);
  15.     }
  16.  
  17.     void split(item<T>* t, int pos, item<T>*& l, item<T>*& r) {
  18.         if (!t)
  19.             l = r = NULL;
  20.         else if (pos <= (t->l ? t->l->c : 0))
  21.             split(t->l, pos, l, t->l), r = t, upd(t);
  22.         else
  23.             split(t->r, pos - (t->l ? t->l->c : 0) - 1, t->r, r), l = t, upd(t);
  24.     }
  25.  
  26.     void merge(item<T>*& t, item<T>* l, item<T>* r) {
  27.         if (!l || !r)
  28.             t = l ? l : r;
  29.         else if (l->prior > r->prior)
  30.             merge(l->r, l->r, r), t = l, upd(t);
  31.         else
  32.             merge(r->l, l, r->l), t = r, upd(t);
  33.     }
  34.  
  35.     void print(item<T>*& t) {
  36.         if (!t) return;
  37.         print(t->l);
  38.         cout << t->key << " ";
  39.         print(t->r);
  40.     }
  41.  
  42.     void print() {
  43.         print(treap);
  44.     }
  45.  
  46.     void insert(item<T>*& t, int pos, T tit) {
  47.         item<T>* l, * r, * x;
  48.         item<T>* it = new item<T>(tit, rand() * rand());
  49.         it->c = 1;
  50.         split(t, pos - 1, l, r);
  51.         merge(x, l, it);
  52.         merge(t, x, r);
  53.     }
  54.  
  55.     void insert(int pos, T tit) {
  56.         insert(treap, pos, tit);
  57.     }
  58.  
  59.     void erase1(item<T>*& t, int key) {
  60.         int l = (t->l ? t->l->c : 0);
  61.         if (key - 1 == l)
  62.             merge(t, t->l, t->r);
  63.         else
  64.             erase1(key - 1 < l ? t->l : t->r, key - 1 < l ? key : key - l - 1), upd(t);
  65.     }
  66.  
  67.     void erase(int pos) {
  68.         erase1(treap, pos);
  69.     }
  70.  
  71.     void update(int pos, T v) {
  72.         erase(pos);
  73.         insert(pos, v);
  74.     }
  75.  
  76.     T operator[](int x) {
  77.         item<T>* l, * r;
  78.         split(treap, x, l, r);
  79.         if (!treap) return -1;
  80.         item<T>* cp = l;
  81.         if (!cp) return -1;
  82.         while (cp->r) cp = cp->r;
  83.         T res = cp->key;
  84.         merge(treap, l, r);
  85.         return res;
  86.     }
  87.  
  88.     size_t size() {
  89.         return treap ? treap->c : 0;
  90.     }
  91. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement