Guest User

Untitled

a guest
Jan 11th, 2015
488
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <set>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. #include <cstdlib>
  11. #include <cstdio>
  12. #include <string>
  13. #include <utility>
  14. #include <iomanip>
  15.  
  16. using namespace std;
  17.  
  18. struct node {
  19. int val, cnt, y;
  20. long long sum;
  21. bool rev;
  22. node *l,*r;
  23. node () {}
  24. node (int val, int y) : y(y), val(val), cnt(1), sum(val), rev(false), l(NULL), r(NULL) {}
  25. };
  26.  
  27. typedef node * pnode;
  28.  
  29. int cnt(pnode t) {
  30. if (t == NULL)
  31. return 0;
  32. else
  33. return t->cnt;
  34. }
  35.  
  36. long long sum(pnode t) {
  37. if (t == NULL)
  38. return 0;
  39. else
  40. return t->sum;
  41. }
  42.  
  43. void upd(pnode t) {
  44. if (t != NULL) {
  45. t->cnt = cnt(t->l) + 1 + cnt(t->r);
  46. t->sum = sum(t->l) + t->val + sum(t->r);
  47. }
  48. }
  49.  
  50. void push(pnode t) {
  51. if (t && t->rev) {
  52. swap(t->l, t->r);
  53. if (t->l)
  54. t->l->rev ^= true;
  55. if (t->r)
  56. t->r->rev ^= true;
  57. t->rev = false;
  58. }
  59. }
  60.  
  61. void merge(pnode &t, pnode l, pnode r) {
  62. push(l); push(r);
  63. if (l == NULL)
  64. t = r;
  65. else if (r == NULL)
  66. t = l;
  67. else if (l->y > r->y) {
  68. merge(l->r, l->r, r); t = l;
  69. }
  70. else {
  71. merge(r->l, l, r->l); t = r;
  72. }
  73. upd(t);
  74. }
  75.  
  76. void split(pnode t, pnode &l, pnode &r, int x, int add = 0) {
  77. push(t);
  78. if (t == NULL) {
  79. l = r = NULL;
  80. return;
  81. }
  82. int key = cnt(t->l) + 1 + add;
  83. if (x <= key) {
  84. split(t->l, l, t->l, x, add); r = t;
  85. }
  86. else {
  87. split(t->r, t->r, r, x, add + cnt(t->l) + 1); l = t;
  88. }
  89. upd(t);
  90. }
  91.  
  92. void reverse(pnode t, int l, int r) {
  93. pnode a,b;
  94. split(t,t,a,l,0);
  95. split(a,a,b,r-l+2,0);
  96. a->rev^=true;
  97. merge(t,t,a);
  98. merge(t,t,b);
  99. }
  100.  
  101. void swapper(pnode &odd, pnode &even, int l, int r) {
  102. int ol,orr,el,er;
  103. pnode oa,ob,ea,eb;
  104. if (l&1) {
  105. ol=(l+1)/2; orr=r/2;
  106. el=(l+1)/2; er=r/2;
  107. }
  108. else {
  109. ol=l/2+1; orr=r/2+1;
  110. el=l/2; er=r/2;
  111. }
  112. split(odd,odd,oa,ol,0);
  113. split(oa,oa,ob,orr-ol+2,0);
  114. split(even,even,ea,el,0);
  115. split(ea,ea,eb,er-el+2,0);
  116. merge(odd,odd,ea);
  117. merge(odd,odd,ob);
  118. merge(even,even,oa);
  119. merge(even,even,eb);
  120. upd(odd); upd(even);
  121. }
  122.  
  123. long long getsum(pnode odd, pnode even, int l, int r) {
  124. int ol,orr,el,er;
  125. long long ans;
  126. pnode oa,ob,ea,eb;
  127. if (l&1) {
  128. ol=(l+1)/2;
  129. el=(l+1)/2;
  130. }
  131. else {
  132. ol=l/2+1;
  133. el=l/2;
  134. }
  135. if (r&1) {
  136. orr=r/2+1;
  137. er=r/2;
  138. }
  139. else {
  140. orr=r/2;
  141. er=r/2;
  142. }
  143. split(odd,odd,oa,ol,0);
  144. split(oa,oa,ob,orr-ol+2,0);
  145. split(even,even,ea,el,0);
  146. split(ea,ea,eb,er-el+2,0);
  147. ans=sum(ea)+sum(oa);
  148. merge(odd,odd,oa);
  149. merge(odd,odd,ob);
  150. merge(even,even,ea);
  151. merge(even,even,eb);
  152. // 1 2 3 4 5
  153. // 1 3 2 5 4
  154.  
  155. return ans;
  156. }
  157.  
  158. void output(pnode t) {
  159. if (t) {
  160. output(t->l);
  161. printf("%d ",t->val);
  162. output(t->r);
  163. }
  164. }
  165.  
  166. int n,m,q,l,r,test=0;
  167. pnode odd=NULL,even=NULL,add;
  168.  
  169. int main() {
  170. //freopen("input.txt","r",stdin);
  171. //freopen("output.txt","w",stdout);
  172.  
  173. odd = NULL; even = NULL;
  174.  
  175. scanf("%d %d\n", &n, &m);
  176.  
  177. for (int i = 1; i <= n; i++) {
  178. int x;
  179. scanf("%d", &x);
  180. add = new node(x, rand());
  181. if (i & 1)
  182. merge(odd, odd, add);
  183. else
  184. merge(even, even, add);
  185. }
  186.  
  187. for (int i = 1; i <= m; i++) {
  188. int q, l, r;
  189. scanf("%d %d %d\n", &q, &l, &r);
  190. if (q == 1) {
  191. swapper(odd, even, l, r);
  192. //output(odd); output(even);
  193. //printf("\n");
  194. }
  195. else {
  196. //cout<<getsum(odd,even,l,r)<<endl;
  197. printf("%lld\n", getsum(odd, even, l, r));
  198. }
  199. }
  200.  
  201. return 0;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment