Advertisement
ivnikkk

Untitled

Jul 2nd, 2022
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. struct Node
  2. {
  3.     bool isrev;
  4.     int key;
  5.     long long prior;
  6.     int sz;
  7.     int mn;
  8.     Node *l = nullptr, *r = nullptr;
  9.     Node(int _key)
  10.     {
  11.         isrev = 0, sz = 1, mn = key = _key, prior = abs((long long)gen64());
  12.     }
  13. };
  14. void push(Node* v)
  15. {
  16.     if (!v)
  17.         return;
  18.     if (v->isrev)
  19.     {
  20.         swap(v->l, v->r);
  21.         if (v->l)
  22.             v->l->isrev ^= 1;
  23.         if (v->r)
  24.             v->r->isrev ^= 1;
  25.     }
  26.     v->isrev = 0;
  27. }
  28. int sum(Node* v)
  29. {
  30.     return v ? v->sz : 0;
  31. }
  32. int min(Node* v)
  33. {
  34.     push(v);
  35.     return v ? v->mn : INT_MAX;
  36. }
  37. void upd(Node* v)
  38. {
  39.     if (!v)
  40.         return;
  41.     v->sz = sum(v->l) + sum(v->r) + 1;
  42.     v->mn = min(v->key, min(min(v->l), min(v->r)));
  43. }
  44.  
  45. Node* merge(Node* l, Node* r)
  46. {
  47.     push(l);
  48.     push(r);
  49.     if (!l)
  50.         return r;
  51.     if (!r)
  52.         return l;
  53.     if (l->prior > r->prior)
  54.     {
  55.         l->r = merge(l->r, r);
  56.         upd(l);
  57.         return l;
  58.     }
  59.     else
  60.     {
  61.         r->l = merge(l, r->l);
  62.         upd(r);
  63.         return r;
  64.     }
  65. }
  66.  
  67. pair<Node*, Node*> split(Node* p, int x)
  68. {
  69.     push(p);
  70.     if (!p)
  71.         return{ 0, 0 };
  72.     if (sum(p->l) + 1 <= x)
  73.     {
  74.         Node *L, *R;
  75.         tie(L, R) = split(p->r, x - 1 - sum(p->l));
  76.         p->r = L;
  77.         upd(p);
  78.         return{ p, R };
  79.     }
  80.     else
  81.     {
  82.         Node *L, *R;
  83.         tie(L, R) = split(p->l, x);
  84.         p->l = R;
  85.         upd(p);
  86.         return{ L, p };
  87.     }
  88. }
  89.  
  90. int goleft(Node* x)
  91. {
  92.     if (!x)
  93.         return INT_MIN;
  94.     if (!x->l)
  95.         return x->key;
  96.     return goleft(x->l);
  97. }
  98.  
  99. int next(Node* rt, int x)
  100. {
  101.     Node *L, *R;
  102.     tie(L, R) = split(rt, x + 1);
  103.     int ans = goleft(R);
  104.     merge(L, R);
  105.     return ans;
  106. }
  107.  
  108. int goright(Node* x)
  109. {
  110.     if (!x)
  111.         return INT_MIN;
  112.     if (!x->r)
  113.         return x->key;
  114.     return goright(x->r);
  115. }
  116.  
  117. int prev(Node* rt, int x)
  118. {
  119.     Node *L, *R;
  120.     tie(L, R) = split(rt, x);
  121.     int ans = goright(L);
  122.     merge(L, R);
  123.     return ans;
  124. }
  125.  
  126. int find2(Node* rt, int x)
  127. {
  128.     return next(rt, x - 1);
  129. }
  130.  
  131. Node* insert(Node* rt, int x, int idx)
  132. {
  133.     Node *L, *R;
  134.     tie(L, R) = split(rt, idx);
  135.     Node* T = new Node(x);
  136.     return merge(L, merge(T, R));
  137. }
  138.  
  139. Node* remove(Node* rt, int x)
  140. {
  141.     Node *T, *R, *L, *M;
  142.     tie(T, R) = split(rt, x + 1);
  143.     tie(L, M) = split(T, x);
  144.     return merge(L, R);
  145. }
  146.  
  147. Node* move2front(Node* rt, int x, int y)
  148. {
  149.     // L M R --> M L R
  150.     Node *T, *R, *L, *M;
  151.     tie(T, R) = split(rt, y);
  152.     tie(L, M) = split(T, x);
  153.     return merge(M, merge(L, R));
  154. }
  155.  
  156. Node* reverse(Node* rt, int x, int y)
  157. {
  158.     // L M R --> L M! R
  159.     Node *T, *R, *L, *M;
  160.     tie(T, R) = split(rt, y);
  161.     tie(L, M) = split(T, x);
  162.     push(M);
  163.     upd(M);
  164.     M->isrev ^= 1;
  165.     return merge(merge(L, M), R);
  166. }
  167.  
  168. Node* mov(Node* rt, int x, int y)
  169. {
  170.     Node *L, *M1, *M2, *R;
  171.     tie(L, R) = split(rt, y);
  172.     tie(L, M2) = split(L, y - 1);
  173.     tie(L, M1) = split(L, x);
  174.     return rt = merge(merge(L, M2), merge(M1, R));
  175. }
  176.  
  177. long long mv(Node*& rt, int x, int y)
  178. {
  179.     // L M R --> L M! R
  180.     Node *T, *R, *L, *M;
  181.     tie(T, R) = split(rt, y);
  182.     tie(L, M) = split(T, x);
  183.     push(M);
  184.     upd(M);
  185.     int ans = min(M);
  186.     rt = merge(merge(L, M), R);
  187.     return ans;
  188. }
  189.  
  190. void prn2(Node* rt)
  191. {
  192.     if (!rt)
  193.         return;
  194.     push(rt);
  195.     upd(rt);
  196.     prn2(rt->l);
  197.     cout << " " << rt->key;
  198.     prn2(rt->r);
  199. }
  200.  
  201. void prn3(Node* rt, vector<int> &v)
  202. {
  203.     if (!rt)
  204.         return;
  205.     push(rt);
  206.     upd(rt);
  207.     prn3(rt->l, v);
  208.     v.push_back(rt->key);
  209.     prn3(rt->r, v);
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement