Advertisement
HoBoCTb

Untitled

Apr 13th, 2022
1,261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.93 KB | None | 0 0
  1. struct node {
  2.     int x, y;
  3.     unique_ptr<node> l = nullptr, r = nullptr;
  4.  
  5.     node(int x) : x(x), y(rand()) {}
  6. };
  7.  
  8. typedef unique_ptr<node> pnode;
  9.  
  10. auto split(pnode t, int k) -> pair<pnode, pnode> {
  11.     if (t == nullptr) {
  12.         return {nullptr, nullptr};
  13.     }
  14.  
  15.     int key, pri;
  16.     tie(key, pri) = {t->x, t->y};
  17.  
  18.     if (key >= k) {
  19.         auto pa = split(move(t->l), k);
  20.         t->l = move(pa.second);
  21.         return {move(pa.first), move(t)};
  22.     } else {
  23.         auto pa = split(move(t->r), k);
  24.         t->r = move(pa.first);
  25.         return {move(t), move(pa.second)};
  26.     }
  27. }
  28.  
  29. auto merge(pnode l, pnode r) -> pnode {
  30.     if (l == nullptr || r == nullptr) {
  31.         return l ? move(l) : move(r);
  32.     }
  33.  
  34.     if (l->y > r->y) {
  35.         l->r = merge(move(l->r), move(r));
  36.         return l;
  37.     } else {
  38.         r->l = merge(move(l), move(r->l));
  39.         return r;
  40.     }
  41. }
  42.  
  43. auto insert(pnode t, int x) -> pnode {
  44.     auto pa = split(move(t), x);
  45.  
  46.     return merge(move(pa.first), merge(make_unique<node>(x), move(pa.second)));
  47. }
  48.  
  49. auto erase(pnode t, int x) -> pnode {
  50.     auto pa = split(move(t), x);
  51.     auto pa1 = split(move(pa.second), x + 1);
  52.     return merge(move(pa.first), move(pa1.second));
  53. }
  54.  
  55. auto left(pnode& t)-> int {
  56.     if (t->l == nullptr) return t->x;
  57.     return left(t->l);
  58. }
  59.  
  60. auto lower_bound(pnode& t, int x) -> int {
  61.     auto pa = split(move(t), x);
  62.  
  63.     int ans = pa.second? left(pa.second): -1;
  64.  
  65.     t = merge(move(pa.first), move(pa.second));
  66.  
  67.     return ans;
  68. }
  69.  
  70. auto into_vec(pnode t, vector<int>& a) -> void {
  71.     if (t->l) into_vec(move(t->l), a);
  72.     a.push_back(t->x);
  73.     if (t->r) into_vec(move(t->r), a);
  74. }
  75.  
  76. auto into_vec(pnode t) -> vector<int> {
  77.     vector<int> res;
  78.     into_vec(move(t), res);
  79.     return res;
  80. }
  81.  
  82. auto from_vec(vector<int>& from) -> pnode {
  83.     pnode res = nullptr;
  84.     for (auto& i: from) res = insert(move(res), i);
  85.     return res;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement