Advertisement
Guest User

SWAPPER INFORMATICS

a guest
Mar 6th, 2014
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. using namespace std;
  5.  
  6. const int INF = 1e9 + 7;
  7. const int MXN = 1e5 + 7;
  8.  
  9. struct treap {
  10. ll cnt, prior;
  11. ll value, sum;
  12. treap *l, *r;
  13.  
  14. treap() {}
  15. treap(ll v)
  16. {
  17. value = v;
  18. prior = rand() % MXN;
  19. l = r = NULL;
  20. cnt = 1;
  21. sum = v;
  22. }
  23. };
  24.  
  25. typedef treap* tree;
  26.  
  27. tree root_odd, root_even;
  28. ll n, m;
  29.  
  30. ll getsum(tree t) {
  31. return t ? t -> sum : 0;
  32. }
  33.  
  34. ll get(tree t) {
  35. return t ? t -> cnt : 0;
  36. }
  37.  
  38. void upd(tree t) {
  39. if (!t)
  40. return;
  41.  
  42. t -> cnt = get(t -> l) + get(t -> r) + 1;
  43. t -> sum = getsum(t -> l) + getsum(t -> r) + t -> value;
  44. }
  45.  
  46. tree treap_merge(tree a, tree b) {
  47. upd(a);
  48. upd(b);
  49.  
  50. if (!a || !b)
  51. return a ? a : b;
  52.  
  53. tree tmp;
  54. if (a -> prior > b -> prior) {
  55. tmp = a;
  56. tmp -> r = treap_merge(tmp -> r, b);
  57. }
  58. else {
  59. tmp = b;
  60. tmp -> l = treap_merge(a, tmp -> l);
  61. }
  62. upd(tmp);
  63. return tmp;
  64. }
  65.  
  66. void treap_split(tree t, ll k, tree &l, tree &r) {
  67. if (!t) {
  68. l = r = NULL;
  69. return;
  70. }
  71. upd(t);
  72. if (k <= get(t -> l))
  73. treap_split(t -> l, k, l, t -> l), r = t;
  74. else
  75. treap_split(t -> r, k - get(t -> l) - 1, t -> r, r), l = t;
  76.  
  77. upd(l);
  78. upd(r);
  79. }
  80.  
  81. void print(tree v) {
  82. if (!v)
  83. return;
  84.  
  85. print(v -> l);
  86. printf("%lld ", v -> value);
  87. print(v -> r);
  88. }
  89.  
  90. ll get_odd_sum(ll l, ll r) {
  91. if (l > r)
  92. return 0;
  93.  
  94. tree L, R, M;
  95.  
  96. treap_split(root_odd, r, L, R);
  97. treap_split(L, l - 1, L, M);
  98.  
  99. ll tmp = M -> sum;
  100. root_odd = treap_merge(treap_merge(L, M), R);
  101.  
  102. return tmp;
  103. }
  104.  
  105. ll get_even_sum(ll l, ll r) {
  106. if (l > r)
  107. return 0;
  108.  
  109. tree L, R, M;
  110.  
  111. treap_split(root_even, r, L, R);
  112. treap_split(L, l - 1, L, M);
  113.  
  114. ll tmp = M -> sum;
  115. root_even = treap_merge(treap_merge(L, M), R);
  116.  
  117. return tmp;
  118. }
  119.  
  120. int main() {
  121. scanf("%lld%lld", &n, &m);
  122. for (int i = 0; i < n; i++)
  123. {
  124. ll x;
  125. scanf("%lld", &x);
  126. if (i & 1)
  127. root_even = treap_merge(root_even, new treap(x));
  128. else
  129. root_odd = treap_merge(root_odd, new treap(x));
  130. }
  131. printf("Swapper 1:\n");
  132. for (int i = 0; i < m; i++)
  133. {
  134. ll q, x, y, le, re, lo, ro;
  135. scanf("%lld%lld%lld", &q, &x, &y);
  136.  
  137. le = (x - 1) / 2 + 1;
  138. re = y / 2;
  139.  
  140. lo = x / 2 + 1;
  141. ro = (y + 1) / 2;
  142.  
  143. if (q == 1)
  144. {
  145. tree LE, RE, ME;
  146. tree LO, RO, MO;
  147.  
  148. treap_split(root_even, re, LE, RE);
  149. treap_split(LE, le - 1, LE, ME);
  150.  
  151. treap_split(root_odd, ro, LO, RO);
  152. treap_split(LO, lo - 1, LO, MO);
  153.  
  154. root_even = treap_merge(treap_merge(LE, MO), RE);
  155. root_odd = treap_merge(treap_merge(LO, ME), RO);
  156. }
  157. else printf("%lld\n", get_odd_sum(lo, ro) + get_even_sum(le, re));
  158. }
  159. return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement