Advertisement
pomo_mondreganto

Untitled

Mar 21st, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.10 KB | None | 0 0
  1.  
  2. const pair<int, int> NEU = {0, -INF};
  3.  
  4. struct Node {
  5. Node *L, *R;
  6. pair<int, int> val = NEU;
  7. } *root = new Node();
  8.  
  9. pair<int, int> merge(const pair<int, int> &a, const pair<int, int> &b) {
  10. if (a.first >= b.first)
  11. return {a.first, a.second};
  12. return {b.first, b.second};
  13. }
  14.  
  15. void update(Node *cur, int pos, int x, int tl = 0, int tr = INF) {
  16. if (!cur)
  17. return;
  18. if (tl == tr - 1) {
  19. cur->val = {x, pos};
  20. return;
  21. }
  22.  
  23. if (!cur->L)
  24. cur->L = new Node();
  25. if (!cur->R)
  26. cur->R = new Node();
  27.  
  28. int mid = (tl + tr) / 2;
  29.  
  30. if (pos < mid)
  31. update(cur->L, pos, x, tl, mid);
  32. else
  33. update(cur->R, pos, x, mid, tr);
  34. cur->val = merge(cur->L->val, cur->R->val);
  35. }
  36.  
  37. pair<int, int> get(Node *cur, int l, int r, int tl = 0, int tr = INF) {
  38. if (!cur)
  39. return NEU;
  40. if (l >= tr || tl >= r)
  41. return NEU;
  42. if (l <= tl && tr <= r)
  43. return cur->val;
  44. int mid = (tl + tr) / 2;
  45.  
  46. return merge(get(cur->L, l, r, tl, mid), get(cur->R, l, r, mid, tr));
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement