Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. int getRand() { return (rand()<<15) + rand(); }
  2.  
  3. struct Treap {
  4.     Treap *l, *r;
  5.     long long key, prior;
  6.     long long size;
  7.  
  8.     Treap(int x) : key(x), prior(getRand()), l(nullptr), r(nullptr), size(1) {}
  9.     void update() {
  10.         size = 1 + (l? l->size : 0) + (r? r->size : 0);
  11.     }
  12. };
  13.  
  14. Treap* Merge(Treap* L, Treap* R) {
  15.     if (L == nullptr) return R;
  16.     if (R == nullptr) return L;
  17.     if (L->prior > R->prior) {
  18.         L->r = Merge(L->r, R);
  19.         L->update();
  20.         return L;
  21.     }
  22.     R->l = Merge(L, R->l);
  23.     R->update();
  24.     return R;
  25. }
  26.  
  27. pair < Treap*, Treap* > Split(Treap* root, int splitkey) {
  28.     if (root == nullptr) return {nullptr, nullptr};
  29.     if (root->key <= splitkey) {
  30.         auto res = Split(root->r, splitkey);
  31.         root->r = res.first;
  32.         root->update();
  33.         return {root, res.second};
  34.     }
  35.     auto res = Split(root->l, splitkey);
  36.     root->l = res.second;
  37.     root->update();
  38.     return {res.first, root};
  39. }
  40.  
  41. Treap* Insert(Treap* root, int key) {
  42.     auto res = Split(root, key);
  43.     Treap* v = new Treap(key);
  44.     return Merge(Merge(res.first, v), res.second);
  45. }
  46.  
  47. Treap* Delete(Treap* root, int key) {
  48.     /*
  49.     auto res = Split(root, key - 1);
  50.     auto res2 = Split(res.second, key);
  51.     return Merge(res.fist, res2.second);
  52.     */
  53.     if (root == nullptr) return root;
  54.     if (root->key == key) return Merge(root->l, root->r);
  55.     if (root->key < key) {
  56.         root->r = Delete(root->r, key);
  57.         root->update();
  58.     } else {
  59.         root->l = Delete(root->l, key);
  60.         root->update();
  61.     }
  62.     return root;
  63. }
  64.  
  65. bool Search(Treap* root, int key) {
  66.     if (root == nullptr) return false;
  67.     if (root->key == key) return true;
  68.     if (root->key < key) return Search(root->r, key);
  69.     return Search(root->l, key);
  70. }
  71.  
  72. int Kth(Treap* root, int k) {
  73.     long long leftsize = root->l ? root->l->size : 0;
  74.     if (leftsize == k - 1) return root->key;
  75.     if (leftsize < k - 1) return Kth(root->r, k - leftsize - 1);
  76.     return Kth(root->l, k);
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement