Advertisement
Mlxa

ALGO Implicit Treap

Jan 2nd, 2018
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 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.     #define print(a) cout << a << ' '
  8.     template <class A> inline void
  9.     println (A a) { cout << a << eol; }
  10.     template <class A, class... B> inline void
  11.     println (A a, B... b) { print(a), println(b...); }
  12.     #define all(x) begin(x), end(x)
  13.     #define size(x) ll(x.size())
  14. } using namespace Mlxa;
  15. typedef long long  ll;
  16.  
  17. mt19937 getRand;
  18.  
  19. struct node {
  20.     ll val, s, p;
  21.     node *l, *r;
  22.     node (ll V, ll P) : val(V), s(0), p(P), l(nullptr), r(nullptr) {}
  23.     node (ll V) : node(V, getRand()) {}
  24. }; typedef node* ptr; ptr tree;
  25.  
  26. ll getSize (ptr v)  { if (v) return v->s; return 0; }
  27.  
  28. void update (ptr v) { assert(v); v->s = getSize(v->l) + getSize(v->r) + 1; }
  29.  
  30. void out (ptr v)    { println(v->p, v->val, "\t\t ", v->s); }
  31.  
  32. void dfsPrint (ll t, ptr v) {
  33.     if (v) {
  34.         dfsPrint(t + 1, v->r);
  35.         for (ll i(t); i --;) print(' '); out(v);
  36.         dfsPrint(t + 1, v->l); }
  37. }
  38.  
  39. void split (ptr root, ptr &l, ptr &r, ll num) {
  40.     if (root) {
  41.         ll num_of_root = getSize(root->l);
  42.         if (num_of_root < num)
  43.              split(root->r, root->r, r, num - (num_of_root + 1)), l = root;
  44.         else split(root->l, l, root->l, num), r = root;
  45.         update(root);
  46.     } else l = r = nullptr;
  47. }
  48.  
  49. ptr merge (ptr l, ptr r) {
  50.     if (l && r) {
  51.         if (l->p > r->p)    { l->r = merge(l->r, r); update(l); return l; }
  52.         else                { r->l = merge(r->l, l); update(r); return r; }
  53.     } else return l ? l : r;
  54. }
  55.  
  56. void insert (ptr &root, ll num, ptr ins) {
  57.     if (root) { assert(ins && !ins->l && !ins->r);
  58.         ll num_of_root = getSize(root->l);
  59.         assert(0 <= num && num <= root->s);
  60.         if (root->p > ins->p) {
  61.             if (num_of_root < num)
  62.                  insert(root->r, num - (num_of_root + 1), ins);
  63.             else insert(root->l, num, ins);
  64.         }
  65.         else split(root, ins->l, ins->r, num), root = ins;
  66.     }
  67.     else root = ins;
  68.     update(root);
  69. }
  70. inline void insert (ptr& root, ll pos, ll val) { insert(root, pos, new node(val)); }
  71. inline void erase(ptr &root, ll num)
  72. {   assert(root); assert(0 <= num); assert(num < getSize(root));
  73.     ptr left(nullptr), middle(nullptr), right(nullptr);
  74.     split(root, left, middle, num);
  75.     split(middle, middle, right, num + 1);
  76.     delete middle; middle = merge(middle->l, middle->r);
  77.     root = merge( merge(left, middle), right );
  78. }
  79.  
  80. int main () {
  81.     tree = new node(777, numeric_limits<ll>::max()); const ll rep(2*1000*1000);
  82.     for (ll i(0); i < rep; ++ i) insert(tree, i, 5*i+19);
  83.     for (ll ost(rep - 1); ost --;) erase(tree, 0);
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement