Advertisement
K_Y_M_bl_C

Untitled

Feb 12th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.44 KB | None | 0 0
  1. #ifdef _DEBUG
  2. #define _GLIBCXX_DEBUG
  3. #endif
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <bits/stdc++.h>
  7.  
  8. /// НАБИРАЕМ БАЛЛЫ
  9. /// ░░░░░░▄▀▀▀▄░РАБОТЯГИ░░
  10. /// ▄███▀░◐░░░▌░░░░░░░
  11. /// ░░░░▌░░░░░▐░░░░░░░
  12. /// ░░░░▐░░░░░▐░░░░░░░
  13. /// ░░░░▌░░░░░▐▄▄░░░░░
  14. /// ░░░░▌░░░░▄▀▒▒▀▀▀▀▄
  15. /// ░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
  16. /// ░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
  17. /// ░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
  18. /// ░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
  19. /// ░░░░░░░░░░░▌▌░▌▌░░░░░
  20. /// ░░░░░░░░░░░▌▌░▌▌░░░░░
  21. /// ░░░░░░░░░▄▄▌▌▄▌▌░░░░░
  22.  
  23. using namespace __gnu_pbds;
  24. using namespace std;
  25.  
  26. typedef long long ll;
  27. typedef vector<ll> vll;
  28. typedef pair<int, int> pii;
  29. typedef vector<int> vi;
  30. typedef long double ld;
  31. typedef tree<pair<ll, int>, null_type, less<pair<ll, int>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  32.  
  33. #define mk make_pair
  34. #define inb push_back
  35. #define enb emplace_back
  36. #define X first
  37. #define Y second
  38. #define all(v) v.begin(), v.end()
  39. #define sqr(x) (x) * (x)
  40. #define TIME 1.0 * clock() / CLOCKS_PER_SEC
  41. #define y1 AYDARBOG
  42. //continue break pop_back return
  43.  
  44. int solve();
  45.  
  46. int main()
  47. {
  48. //ios_base::sync_with_stdio(0);
  49. //cin.tie(0);
  50. #define TASK "reverse"
  51. #ifndef _DEBUG
  52. freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  53. #endif
  54. solve();
  55. #ifdef _DEBUG
  56. fprintf(stderr, "\nTIME: %.3f\n", TIME);
  57. #endif
  58. }
  59.  
  60. const int INF = 2e9 + 7;
  61.  
  62. const int BUFSZ = (int)1e6 + 7;
  63. char buf[BUFSZ];
  64. string get_str()
  65. {
  66. scanf(" %s", buf);
  67. return string(buf);
  68. }
  69.  
  70. mt19937 mrand(306);
  71.  
  72. struct Node
  73. {
  74. int val, y, l, r, sz, f;
  75. Node() { val = 0, y = mrand(), l = 0, r = 0, sz = 0, f = 0; };
  76. Node(int val) : val(val), y(mrand()), l(0), r(0), sz(1), f(0) {};
  77. };
  78.  
  79. Node t[BUFSZ];
  80.  
  81. void recalc(int v)
  82. {
  83. t[v].sz = t[t[v].l].sz + t[t[v].r].sz + 1;
  84. }
  85.  
  86. void update(int v)
  87. {
  88. if (!v)
  89. return;
  90. recalc(v);
  91. if (!t[v].f)
  92. return;
  93. if (t[v].f)
  94. swap(t[v].l, t[v].r);
  95. t[t[v].l].f ^= t[v].f;
  96. t[t[v].r].f ^= t[v].f;
  97. t[v].f = 0;
  98. }
  99.  
  100. pii split(int v, int x)
  101. {
  102. update(v);
  103. if (!v)
  104. return mk(0, 0);
  105. if (t[t[v].l].sz < x)
  106. {
  107. pii cur = split(t[v].r, x - t[t[v].l].sz - 1);
  108. t[v].r = cur.X;
  109. recalc(v);
  110. return mk(v, cur.Y);
  111. }
  112. else
  113. {
  114. pii cur = split(t[v].l, x);
  115. t[v].l = cur.Y;
  116. recalc(v);
  117. return mk(cur.X, v);
  118. }
  119. }
  120.  
  121. int merge(int l, int r)
  122. {
  123. update(l), update(r);
  124. if (l * r == 0)
  125. {
  126. if (l)
  127. return l;
  128. return r;
  129. }
  130. if (t[l].y > t[r].y)
  131. {
  132. t[l].r = merge(t[l].r, r);
  133. recalc(l);
  134. return l;
  135. }
  136. else
  137. {
  138. t[r].l = merge(l, t[r].l);
  139. recalc(r);
  140. return r;
  141. }
  142. }
  143.  
  144. int find(int v, int x)
  145. {
  146. update(v);
  147. if (t[t[v].l].sz + 1 == x)
  148. return t[v].val;
  149. if (t[t[v].l].sz < x)
  150. return find(t[v].r, x - t[t[v].l].sz - 1);
  151. return find(t[v].l, x);
  152. }
  153.  
  154. void print(int v)
  155. {
  156. update(v);
  157. if (!v)
  158. return;
  159. print(t[v].l);
  160. printf("%d ", t[v].val);
  161. print(t[v].r);
  162. }
  163.  
  164. int solve()
  165. {
  166. int n, q;
  167. scanf("%d %d", &n, &q);
  168. int root = 1;
  169. for (int i = 0; i < n; ++i)
  170. {
  171. int x;
  172. scanf("%d", &x);
  173. t[i + 1] = Node(x);
  174. if (i)
  175. root = merge(root, i + 1);
  176. }
  177. while (q--)
  178. {
  179. string cmd = get_str();
  180. if (cmd[0] == 'R')
  181. {
  182. int l, r;
  183. scanf("%d %d", &l, &r);
  184. --l, --r;
  185. pii spl = split(root, l);
  186. int tl = spl.X;
  187. int mid = spl.Y;
  188. spl = split(mid, r - l + 1);
  189. int tr = spl.Y;
  190. mid = spl.X;
  191. t[mid].f ^= 1;
  192. update(mid);
  193. root = merge(tl, mid);
  194. root = merge(root, tr);
  195. }
  196. else
  197. {
  198. int x;
  199. scanf("%d", &x);
  200. printf("%d\n", find(root, x));
  201. }
  202. }
  203. print(root);
  204. puts("");
  205. return 0;
  206. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement