Advertisement
Raslboyy

for_ildar

Dec 27th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. class Node
  2. {
  3. public:
  4.     Node(int val, int prior) : val(val), prior(prior), size(1), l(nullptr), r(nullptr) {};
  5.     Node* get_l() { relax(); return l; }
  6.     Node* get_r() { relax(); return r; }
  7.     void set_l(Node* l) {
  8.         this->l = l;
  9.         relax();
  10.     }
  11.     void set_r(Node* r) {
  12.         this->r = r;
  13.         relax();
  14.     }
  15.     int val;
  16.     int size;
  17.     int prior;
  18. private:
  19.     Node* l;
  20.     Node* r;
  21.     void relax();
  22. };
  23.  
  24. void Node::relax() {
  25.     int lSize = (l == nullptr ? 0 : l->size);
  26.     int rSize = (r == nullptr ? 0 : r->size);
  27.     size = lSize + rSize + 1;
  28. }
  29.  
  30. Node* root = nullptr;
  31.  
  32. Node* merge(Node* t1, Node* t2) {
  33.     if (t1 == nullptr)
  34.         return t2;
  35.     if (t2 == nullptr)
  36.         return t1;
  37.     if (t1->prior > t2->prior) {
  38.         t1->set_r(merge(t1->get_r(), t2));
  39.         return t1;
  40.     }
  41.     else {
  42.         t2->set_l(merge(t1, t2->get_l()));
  43.         return t2;
  44.     }
  45. }
  46.  
  47. pair<Node*, Node*> split(Node* t, int val) {
  48.     if (t == nullptr)
  49.         return make_pair(nullptr, nullptr);
  50.     if (val > t->val) {
  51.         auto newT = split(t->get_r(), val);
  52.         t->set_r(newT.first);
  53.         return make_pair(t, newT.second);
  54.     }
  55.     else {
  56.         auto newT = split(t->get_l(), val);
  57.         t->set_l(newT.second);
  58.         return make_pair(newT.first, t);
  59.     }
  60. }
  61.  
  62. void emplace(int val, Node* t = root) {
  63.     if (root == nullptr) {
  64.         root = new Node(val, ((rand() << 16) | rand()));
  65.         return;
  66.     }
  67.     auto p = split(t, val);
  68.     root = merge(merge(p.first, new Node(val, (rand() << 16) | rand())), p.second);
  69. }
  70.  
  71. void erase(int val, Node* t = root) {
  72.     auto p1 = split(t, val);
  73.     auto p2 = split(p1.second, val + 1);
  74.     root = merge(p1.first, p2.second);
  75. }
  76.  
  77. pair<int, int> get(int val, Node* t = root) {
  78.     auto p = split(t, val);
  79.     int res = p.second->size;
  80.     root = merge(p.first, p.second);
  81.     return make_pair(root->size - res, res);
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement