Advertisement
cincout

Декартово (*=-1, reverse)

Apr 28th, 2019
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.87 KB | None | 0 0
  1. struct node {
  2. node *l, *r;
  3. int x, y, sz;
  4. bool mult;
  5. bool rev;
  6. node(int key)
  7. {
  8. mult = false;
  9. rev = false;
  10. x = key;
  11. y = rand();
  12. l = 0;
  13. r = 0;
  14. sz = 1;
  15. }
  16. };
  17.  
  18. int get_sz(node * a)
  19. {
  20. if (a == 0)
  21. return 0;
  22. return a->sz;
  23. }
  24.  
  25. void update(node * a)
  26. {
  27. if (a == 0)
  28. {
  29. return;
  30. }
  31. a->sz = 1 + get_sz(a->r) + get_sz(a->l);
  32. if (a->mult == 1)
  33. {
  34. a->x *= -1;
  35. if (a->l != 0)
  36. a->l->mult ^= 1;
  37. if (a->r != 0)
  38. a->r->mult ^= 1;
  39. a->mult = 0;
  40. }
  41. if (a->rev == 1)
  42. {
  43. swap(a->l, a->r);
  44. if (a->l != 0)
  45. a->l->rev ^= 1;
  46. if (a->r != 0)
  47. a->r->rev ^= 1;
  48. a->rev = 0;
  49. }
  50. }
  51.  
  52. pair<node*, node*> split_k(node * a, int k)
  53. {
  54. if (a == 0)
  55. {
  56. return {0, 0};
  57. }
  58. update(a);
  59. if (get_sz(a->l) >= k)
  60. {
  61. auto b = split_k(a->l, k);
  62. a->l = b.second;
  63. update(a);
  64. update(b.first);
  65. return {b.first, a};
  66. }
  67. else
  68. {
  69. auto b = split_k(a->r, k - 1 - get_sz(a->l));
  70. a->r = b.first;
  71. update(a);
  72. update(b.second);
  73. return {a, b.second};
  74. }
  75. }
  76.  
  77. node * merge(node *a, node *b)
  78. {
  79. update(a);
  80. update(b);
  81. if (a == 0)
  82. return b;
  83. if (b == 0)
  84. return a;
  85. if (a->y > b->y)
  86. {
  87. a->r = merge(a->r, b);
  88. update(a);
  89. return a;
  90. }
  91. else
  92. {
  93. b->l = merge(a, b->l);
  94. update(b);
  95. return b;
  96. }
  97. }
  98.  
  99.  
  100. node * insert(node * a, int r)
  101. {
  102. node * nk = new node(r);
  103. return merge(a, nk);
  104. }
  105.  
  106. void output(node * a)
  107. {
  108. update(a);
  109. if (a == 0)
  110. return;
  111. output(a->l);
  112. cerr << a->x << " ";
  113. output(a->r);
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement