Advertisement
tsypko

splay tree 2

Nov 15th, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define null NULL
  5.  
  6. struct splay_tree {
  7. private:
  8.     struct node {
  9.         int key, sz, m;
  10.         node *l, *r, *p;
  11.         node() {
  12.             l = r = p = null;
  13.             key = sz = m = 0;
  14.         }
  15.         node(int key) {
  16.             this->key = m = key;
  17.             sz = 1;
  18.             l = r = p = null;
  19.         }
  20.     };
  21.     typedef node *tnode;
  22.     node *root;
  23.     inline void set_parent(tnode child, tnode parent) {
  24.         if (child) {
  25.             child->p = parent;
  26.         }
  27.     }
  28.     inline void keep_parent(tnode v) {
  29.         set_parent(v->l, v);
  30.         set_parent(v->r, v);
  31.     }
  32.     inline int get_sz(tnode v) {
  33.         return (v ? v->sz : 0);
  34.     }
  35.     inline int get_min(tnode v) {
  36.         return (v ? v->m : INT_MAX);
  37.     }
  38.     inline void upd(tnode v) {
  39.         if (v) {
  40.             v->sz = 1 + get_sz(v->l) + get_sz(v->r);
  41.             v->m = min(v->key, min(get_min(v->l), get_min(v->r)));
  42.         }
  43.     }
  44.     void rotate(tnode child, tnode parent) {
  45.         tnode gparent = parent->p;
  46.         if (gparent) {
  47.             (gparent->l == parent ? gparent->l : gparent->r) = child;
  48.         }
  49.         if (parent->l == child) {
  50.             parent->l = child->r;
  51.             child->r = parent;
  52.         } else {
  53.             parent->r = child->l;
  54.             child->l = parent;
  55.         }
  56.         keep_parent(child);
  57.         keep_parent(parent);
  58.         upd(parent);
  59.         upd(child);
  60.         child->p = gparent;
  61.     }
  62.     tnode splay(tnode v) {
  63.         if (!v->p)
  64.             return v;
  65.         if (!v->p->p) {
  66.             rotate(v, v->p);
  67.             return v;
  68.         }
  69.         tnode parent = v->p;
  70.         tnode gparent = parent->p;
  71.         if ((parent->l == v) == (gparent->l == parent)) {
  72.             rotate(parent, gparent);
  73.             rotate(v, parent);
  74.         } else {
  75.             rotate(v, parent);
  76.             rotate(v, gparent);
  77.         }
  78.         return splay(v);
  79.     }
  80.     tnode find(tnode v, int key) {
  81.         if (!v)
  82.             return null;
  83.         if (get_sz(v->l) < key) {
  84.             key -= get_sz(v->l);
  85.         } else {
  86.             return find(v->l, key);
  87.         }
  88.         if (key == 1) {
  89.             return splay(v);
  90.         }
  91.         return find(v->r, key - 1);
  92.     }
  93.     void split(tnode t, int key, tnode &l, tnode &r) {
  94.         if (!t) {
  95.             l = r = null;
  96.             return;
  97.         }
  98.         if(key == 0){
  99.             l = null;
  100.             r = t;
  101.             return;
  102.         }
  103.         if(key == get_sz(t)){
  104.             l = t;
  105.             r = null;
  106.             return;
  107.         }
  108.         t = find(t, key + 1);
  109.         l = t->l;
  110.         r = t;
  111.         r->l = null;
  112.         set_parent(l, null);
  113.         upd(l);
  114.         upd(r);
  115.     }
  116.     tnode merge(tnode l, tnode r) {
  117.         if (!l)
  118.             return r;
  119.         if (!r)
  120.             return l;
  121.         r = find(r, 1);
  122.         assert(get_sz(r->l) == 0);
  123.         r->l = l;
  124.         l->p = r;
  125.         upd(r);
  126.         return r;
  127.     }
  128.     inline int _get_min(int l, int r) {
  129.         tnode t1, t2, t3;
  130.         split(root, r, t2, t3);
  131.         split(t2, l - 1, t1, t2);
  132.         int ans = t2->m;
  133.         root = merge(t1, t2);
  134.         root = merge(root, t3);
  135.         return ans;
  136.     }
  137.     inline void _add(int pos, int val) {
  138.         tnode t1, t2 = new node(val), t3;
  139.         split(root, pos, t1, t3);
  140.         root = merge(t1, t2);
  141.         root = merge(root, t3);
  142.     }
  143.     void print(tnode t){
  144.         if(!t)
  145.             return;
  146.         print(t->l);
  147.         cout << t->key << " ";
  148.         print(t->r);
  149.     }
  150. public:
  151.     splay_tree() {
  152.         root = null;
  153.     }
  154.     int get_min(int l, int r){
  155.         return _get_min(l, r);
  156.     }
  157.     void add(int pos, int val){
  158.         _add(pos, val);
  159.     }
  160.     void print(){
  161.         print(root);
  162.         cout << endl;
  163.     }
  164. };
  165.  
  166. #define endl "\n"
  167.  
  168. int main(int argc, char **argv) {
  169.     ios_base::sync_with_stdio(0);
  170.     cin.tie(0);
  171.     cout.tie(0);
  172.  
  173.     return 0;
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement