Advertisement
Mlxa

OST-treap

Jan 7th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. namespace Mlxa {
  5.     #define read cin
  6.     #define eol endl
  7.     template <class A> inline void
  8.     print (A a) { cout << a << ' '; }
  9.     template <class A> inline void
  10.     println (A a) { cout << a << eol; }
  11.     template <class A, class... B> inline void
  12.     println (A a, B... b) { print(a), println(b...); }
  13.     #define w(...) println(__VA_ARGS__)
  14.     #define limit numeric_limits
  15.     #define all(x) begin(x), end(x)
  16. } using namespace Mlxa;
  17. typedef long long  ll;
  18.  
  19.  
  20. namespace Node
  21. {
  22.     mt19937 getRand;
  23.     struct node
  24.     {
  25.         ll k, p, s;
  26.         node *l, *r;
  27.         node (ll K, ll P) : k(K), p(P), s(1) {l = r = nullptr;}
  28.         node (ll K) : node(K, getRand()) {}
  29.     }; typedef node *ptr;
  30.  
  31.     inline ll getSize (ptr v) { return v ? v->s : 0; }
  32.     inline void update (ptr v) { if (v) v->s = 1 + getSize(v->l) + getSize(v->r); }
  33.  
  34.     void out (ptr v, ll t = 0, const char* tab = "", const char* sep = "")
  35.     {   if (v) {
  36.             out(v->l, t + 1, tab, sep);
  37.             for (ll i(0); i < t; ++ i ) cout << tab; cout << v->k << " " << v->s << sep;
  38.             out(v->r, t + 1, tab, sep);
  39.         }
  40.     }
  41.  
  42.     ll find_by_order (ptr v, ll n)
  43.     {
  44.         assert(v && "Out of range(((");
  45.         ll numv = getSize(v->l);
  46.         if (n == numv) return v->k;
  47.         if (n < numv) return find_by_order(v->l, n);
  48.         return find_by_order(v->r, n - (numv + 1));
  49.     }
  50.  
  51.     void split (ptr v, ptr &l, ptr &r, ll key)
  52.     {
  53.         if (v) {
  54.             if (key < v->k) {
  55.                 split(v->l, l, v->l, key);
  56.                 r = v;
  57.                 update(l);
  58.                 update(r);
  59.             } else {
  60.                 split(v->r, v->r, r, key);
  61.                 l = v;
  62.                 update(l);
  63.                 update(r);
  64.             }
  65.         } else l = r = nullptr;
  66.     }
  67.  
  68.     ptr merge (ptr l, ptr r)
  69.     {
  70.         if (l && r) {
  71.             if(l->k > r->k) swap(l, r);
  72.             if (l-> p > r->p) {
  73.                 l->r = merge(l->r, r);
  74.                 update(l);
  75.                 update(r);
  76.                 return l;
  77.             } else {
  78.                 r->l = merge(r->l, l);
  79.                 update(l);
  80.                 update(r);
  81.                 return r;
  82.             }
  83.         } else return l ? l : r;
  84.     }
  85.  
  86.     void erase (ptr &v, ll key)
  87.     {
  88.         ptr l, m, r; l = m = r = nullptr;
  89.         split(v, l, m, key - 1); // Test
  90.         split(m, m, r, key);
  91.         // Maybe delete m
  92.         v = merge(l, r);
  93.     }
  94.  
  95.     void erase_one (ptr &v, ll key)
  96.     {
  97.         ptr l, m, r; l = m = r = nullptr;
  98.         split(v, l, m, key - 1); // Test
  99.         split(m, m, r, key);
  100.         m = merge(m->l, m->r);
  101.         // Maybe delete m
  102.         v = merge(merge(l, m), r);
  103.     }
  104.  
  105.     void insert (ptr &v, ll key)
  106.     {
  107.         ptr l, r, i; l = r = nullptr;
  108.         i = new node(key);
  109.         split(v, l, r, key);
  110.         v = merge(merge(l, i), r);
  111.     }
  112. }
  113.  
  114. using namespace Node;
  115. struct OST
  116. {
  117.     string name;
  118.     ptr root;
  119.     OST () : root(new node(-1e18, limit<ll>::max())) {}
  120.     OST (string s) : OST () { name = s; }
  121.     void clear () { root = new node(-1e18, limit<ll>::max()); }
  122.     ll size () { update(root); return getSize(root) - 1; }
  123.     ll operator [] (ll i) { return Node::find_by_order(root, i + 1);  }
  124.     ll find_by_order (ll i) { return Node::find_by_order(root, i + 1); }
  125.     void insert (ll k) { Node::insert(root, k); }
  126.     void erase (ll k) { Node::erase(root, k); }
  127.     void erase_one (ll k) { Node::erase_one(root, k); }
  128.     void out () { w("out", name); Node::out(root, 0, "[]", "\n"); w("\nend", name); }
  129. };
  130.  
  131.  
  132. int main ()
  133. {
  134.     OST o("test...");
  135.     o.insert(-1);
  136.     o.insert(1);
  137.     o.insert(1);
  138.     o.insert(2);
  139.     o.insert(2);
  140.     o.insert(5);
  141.     o.out();
  142.     o.erase_one(1);
  143.     o.out();
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement