Advertisement
Guest User

Cartesian tree with array

a guest
Apr 3rd, 2012
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.91 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <time.h>
  5.  
  6. struct segment{
  7. int y;
  8. int left;
  9. int right;
  10. int size;
  11. bool rev;
  12. long long summ;
  13. };
  14.  
  15. struct splited_segments{
  16. int id_left;
  17. int id_right;
  18. };
  19.  
  20. struct count_out{
  21. int head;
  22. long long summ;
  23. };
  24.  
  25. using namespace std;
  26.  
  27. int n,m,h,k,a,b,c;
  28. struct segment T[200006];
  29. struct splited_segments U;
  30. struct count_out P;
  31.  
  32. int merge(int id1, int id2){
  33. if (id1==0){
  34. return id2;
  35. }
  36. if (id2==0){
  37. return id1;
  38. }
  39. if (T[id1].y>T[id2].y){//id1 - новая вершина
  40. T[id1].size+=T[id2].size;
  41. T[id1].summ+=T[id2].summ;
  42. if (T[id1].rev==true){
  43. T[id1].rev=false;
  44. k=T[id1].left;
  45. T[id1].left=T[id1].right;
  46. T[id1].right=k;
  47. T[T[id1].left].rev= !T[T[id1].left].rev;
  48. T[T[id1].right].rev= !T[T[id1].right].rev;
  49. }
  50. T[id1].right=merge(T[id1].right,id2);
  51.  
  52. return id1;
  53. }else{ //id2 - новая вершина
  54. T[id2].size+=T[id1].size;
  55. T[id2].summ+=T[id1].summ;
  56. if (T[id2].rev==true){
  57. T[id2].rev=false;
  58. k=T[id2].left;
  59. T[id2].left=T[id2].right;
  60. T[id2].right=k;
  61. T[T[id2].left].rev= !T[T[id2].left].rev;
  62. T[T[id2].right].rev= !T[T[id2].right].rev;
  63. }
  64. T[id2].left=merge(id1,T[id2].left);
  65. return id2;
  66. }
  67. }
  68.  
  69. struct splited_segments split(int id, int x){
  70. struct splited_segments temp,temp2;
  71.  
  72. if (id==0){
  73. temp.id_left=0;
  74. temp.id_right=0;
  75. return temp;
  76. }
  77. if (T[id].rev==true){
  78. T[id].rev=false;
  79. k=T[id].left;
  80. T[id].left=T[id].right;
  81. T[id].right=k;
  82. T[T[id].left].rev= !T[T[id].left].rev;
  83. T[T[id].right].rev= !T[T[id].right].rev;
  84. }
  85.  
  86. if (x<=T[T[id].left].size){
  87. T[id].size-=T[T[id].left].size;
  88. T[id].summ-=T[T[id].left].summ;
  89. temp=split(T[id].left,x);
  90. T[id].left=0;
  91. temp2.id_left=temp.id_left;
  92. temp2.id_right=merge(temp.id_right,id);
  93. }else{
  94. T[id].size-=T[T[id].right].size;
  95. T[id].summ-=T[T[id].right].summ;
  96. temp=split(T[id].right,x-T[T[id].left].size-1);
  97. T[id].right=0;
  98. temp2.id_right=temp.id_right;
  99. temp2.id_left=merge(id,temp.id_left);
  100. }
  101. return temp2;
  102. }
  103.  
  104. void draw_tree(int id, int l){
  105. if (T[id].right>0){
  106. draw_tree(T[id].right,l+1);
  107. }
  108. for (int i=0; i<l*5; i++){
  109. printf(" ");
  110. }
  111. printf("%I64d\n",T[id].summ);
  112. if (T[id].left>0){
  113. draw_tree(T[id].left,l+1);
  114. }
  115. }
  116.  
  117. int revers(int id, int l, int r){
  118. struct splited_segments temp, temp2;
  119. temp=split(id,r);
  120. temp2=split(temp.id_left,l);
  121. T[temp2.id_right].rev=!T[temp2.id_right].rev;
  122. return merge(merge(temp2.id_left,temp2.id_right),temp.id_right);
  123. }
  124.  
  125. struct count_out count(int id, int l, int r){
  126. struct splited_segments temp, temp2;
  127. struct count_out output;
  128. temp=split(id,r);
  129. temp2=split(temp.id_left,l);
  130. output.summ=T[temp2.id_right].summ;
  131. output.head=merge(merge(temp2.id_left,temp2.id_right),temp.id_right);
  132. return output;
  133. }
  134.  
  135. int main(int argc, char** argv) {
  136. freopen("reverse.in","rt",stdin);
  137. freopen("reverse.out","wt",stdout);
  138. scanf("%d %d",&n,&m);
  139. srand(time(NULL)*time(NULL));
  140. for (int i=1; i<=n; i++){
  141. scanf("%I64d",&T[i].summ);
  142. T[i].y=rand();
  143. T[i].size=1;
  144. h=merge(h,i);
  145. }
  146. for (int i=0; i<m; i++){
  147. scanf("%d %d %d",&a,&b,&c);
  148. b--;
  149. if (a==0){
  150. P=count(h,b,c);
  151. printf("%I64d\n",P.summ);
  152. h=P.head;
  153. }else{
  154. h=revers(h,b,c);
  155. }
  156. }
  157. return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement