Guest User

Untitled

a guest
Feb 19th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.19 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int rnd() {
  6. int x = rand() << 16;
  7. x ^= rand();
  8. return x;
  9. }
  10.  
  11. struct Treap{
  12. int key, priority;
  13. Treap* left;
  14. Treap* right;
  15. int size;
  16.  
  17. Treap() : key(0), priority(0), left(nullptr), right(nullptr), size(0) {}
  18. Treap(int x) : key(x), priority(rnd()), left(nullptr), right(nullptr), size(1) {}
  19. };
  20.  
  21. int get_size(Treap* v) {
  22. return v ? v->size : 0;
  23. }
  24.  
  25. void recalc(Treap* &v) {
  26. if (v)
  27. v->size = 1 + get_size(v->left) + get_size(v->right);
  28. }
  29.  
  30. void merge(Treap* &v, Treap* l, Treap* r) {
  31. if (!l || !r) {
  32. v = l ? l : r;
  33. } else if (l->priority > r->priority) {
  34. merge(l->right, l->right, r);
  35. v = l;
  36. } else {
  37. merge(r->left, l, r->left);
  38. v = r;
  39. }
  40. recalc(v);
  41. }
  42.  
  43. void split(Treap* v, Treap* &l, Treap* &r, int key) {
  44. if (!v) {
  45. l = r = nullptr;
  46. } else {
  47. int lsize = get_size(v->left);
  48. if (key <= lsize) {
  49. split(v->left, l, r, key);
  50. v->left = r;
  51. r = v;
  52. } else {
  53. split(v->right, l, r, key - lsize - 1);
  54. v->right = l;
  55. l = v;
  56. }
  57. }
  58. recalc(l); recalc(r);
  59. }
Add Comment
Please, Sign In to add comment