Guest User

Untitled

a guest
Aug 21st, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct node{
  6. int v, w, sz, sum;
  7. node *l, *r;
  8. bool rev;
  9. node(int v_=0){
  10. v = sum = v_;
  11. w = rand();
  12. sz = 1;
  13. l = r = nullptr;
  14. rev = false;
  15. }
  16. };
  17.  
  18. inline int sz(node *t){
  19. return t ? t->sz : 0;
  20. }
  21.  
  22. inline int sum(node *t){
  23. return t ? t->sum : 0;
  24. }
  25.  
  26. inline void flush(node *t){
  27. if(!t || !t->rev) return;
  28. swap(t->l, t->r);
  29. if(t->l) t->l->rev ^= 1;
  30. if(t->r) t->r->rev ^= 1;
  31. }
  32.  
  33. inline void update(node *t){
  34. if(t == nullptr) return;
  35. t->sz = sz(t->l) + sz(t->r) + 1;
  36. t->sum = sum(t->l) + sum(t->r) + t->v;
  37. }
  38.  
  39. inline void merge(node*& t, node *l, node *r){
  40. if(!l || !r) return void(t = l?l:r);
  41. flush(l), flush(r);
  42.  
  43. if(l->w >= r->w){
  44. merge(l->r, l->r, r);
  45. t = l;
  46. }else{
  47. merge(r->l, l, r->l);
  48. t = r;
  49. }
  50. update(t);
  51. }
  52.  
  53. inline void split(node *t, node*& l, node*& r, int p){
  54. if(!t) return void(l = r = nullptr);
  55. flush(t);
  56.  
  57. int pos = sz(t->l) + 1;
  58. if(pos < p){
  59. l = t;
  60. split(t->r, t->r, r, p-pos);
  61. }else{
  62. r = t;
  63. split(t->l, l, t->l, p);
  64. }
  65. update(t);
  66. }
  67.  
  68. inline void insert(node*& t, int p, int v){
  69. node *l=0, *r=0, *aux= new node(v);
  70. split(t, l, r, p);
  71. merge(l, l, aux);
  72. merge(t, l, r);
  73. }
  74.  
  75. inline void erase(node*& t, int p){
  76. node *l=0, *r=0, *aux=0;
  77. split(t, l, r, p);
  78. split(r, aux, r, 2);
  79. merge(t, l, r);
  80. delete aux;
  81. }
  82.  
  83. inline int query(node*& t, int l, int r){
  84. node *a=0, *b=0, *aux=0;
  85. split(t, a, b, r+1);
  86. split(a, aux, a, l);
  87. int ans = sum(a);
  88. merge(a, aux, a);
  89. merge(t, a, b);
  90. return ans;
  91. }
  92.  
  93. inline void reverse(node*& t, int l, int r){
  94. node *a=0, *b=0, *aux=0;
  95. split(t, a, b, r+1);
  96. split(a, aux, a, l);
  97. a->rev ^= 1;
  98. merge(a, aux, a);
  99. merge(t, a, b);
  100. }
  101.  
  102. ostream& operator<<(ostream& out, node *t){
  103. flush(t);
  104. if(t) out << t->l << t->v << " " << t->r;
  105. return out;
  106. }
  107.  
  108. int main(){
  109. node *t=0;
  110. int n;
  111. cin >> n;
  112. for(int i=1;i<=n;i++){
  113. int x;
  114. cin >> x;
  115. insert(t, i, x);
  116. }
  117. cout << t << "\n";
  118. reverse(t, 2, 3);
  119. cout << t << "\n";
  120. return 0;
  121. }
Add Comment
Please, Sign In to add comment