Advertisement
GerONSo

deckart tree (split, merge, insert, erase, get)

Nov 4th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.96 KB | None | 0 0
  1. /*
  2.  
  3. ∧_∧
  4. ( ・ω・。)つ━☆・*。
  5. ⊂  ノ    ・゜
  6. しーJ   Accepted
  7.  
  8. */
  9.  
  10.  
  11.  
  12. // #pragma GCC optimize("O3")
  13. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  14.  
  15. #include <bits/stdc++.h>
  16. #include <ext/pb_ds/assoc_container.hpp>
  17. #include <ext/pb_ds/tree_policy.hpp>
  18.  
  19. #define ll long long
  20. #define all(x) begin(x), end(x)
  21. #define x first
  22. #define y second
  23. #define int long long
  24.  
  25. using namespace std;
  26. using namespace __gnu_pbds;
  27.  
  28. typedef long double ld;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. cout << fixed << setprecision(14);
  39. #ifdef _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #else
  43. freopen("river.in", "r", stdin);
  44. freopen("river.out", "w", stdout);
  45. #endif
  46. }
  47.  
  48. const int MAXN = 1e6 + 10;
  49. const int MAXM = 600;
  50. const int INF = 1e18;
  51. const int BASE = 47;
  52. const int MOD = 1e9 + 7;
  53. const int MAXLOG = 21;
  54.  
  55. mt19937 rr(time(0));
  56.  
  57. struct treap {
  58. treap *left = nullptr;
  59. treap *right = nullptr;
  60. int sum, prior, sz, val, orig;
  61.  
  62. treap(int sum, int orig) {
  63. this->sum = sum;
  64. this->val = sum;
  65. this->orig = orig;
  66. this->prior = rr();
  67. this->sz = 1;
  68. }
  69. };
  70.  
  71.  
  72. int get_size(treap *&root) {
  73. return ((root == nullptr) ? 0 : root->sz);
  74. }
  75.  
  76. int get_val(treap *&root) {
  77. return ((root == nullptr) ? 0 : root->sum);
  78. }
  79.  
  80. int get_val2(treap *&root) {
  81. return ((root == nullptr) ? 0 : root->orig);
  82. }
  83.  
  84. void print(treap *a) {
  85. if(a->left != nullptr) print(a->left);
  86. cerr << get_val2(a) << " " << get_val2(a->left) << " " << get_val2(a->right) << " " << get_size(a) << '\n';
  87. if(a->right != nullptr) print(a->right);
  88. }
  89.  
  90. void update(treap *&root) {
  91. if(root == nullptr) return;
  92. root->sz = get_size(root->left) + get_size(root->right) + 1;
  93. root->sum = get_val(root->left) + get_val(root->right) + root->val;
  94. }
  95.  
  96. pair<treap*, treap*> split(treap *&root, int key) {
  97. if(root == nullptr) {
  98. return {nullptr, nullptr};
  99. }
  100. int root_key = get_size(root->left);
  101. // cerr << root->sz << " " << root_key << '\n';
  102. if(key > root_key) {
  103. pair<treap*, treap*> splitted = split(root->right, key - get_size(root->left) - 1);
  104. root->right = splitted.x;
  105. update(root);
  106. return {root, splitted.y};
  107. }
  108. else {
  109. pair<treap*, treap*> splitted = split(root->left, key);
  110. root->left = splitted.y;
  111. update(root);
  112. return {splitted.x, root};
  113. }
  114. }
  115.  
  116. treap* merge(treap *&left, treap *&right) {
  117. if(left == nullptr) {
  118. return right;
  119. }
  120. if(right == nullptr) {
  121. return left;
  122. }
  123. if(left->prior > right->prior) {
  124. left->right = merge(left->right, right);
  125. update(left);
  126. return left;
  127. }
  128. else {
  129. right->left = merge(left, right->left);
  130. update(right);
  131. return right;
  132. }
  133. }
  134.  
  135. void insert(treap *&root, int pos, int val) {
  136. pair<treap*, treap*> splitted = split(root, pos);
  137. treap *nw = new treap(val * val, val);
  138. splitted.x = merge(splitted.x, nw);
  139. update(splitted.x);
  140. // cerr << get_val(left) << '\n';
  141. splitted.x = merge(splitted.x, splitted.y);
  142. update(splitted.x);
  143. // cerr << get_val(left) << '\n';
  144. root = splitted.x;
  145. }
  146.  
  147. void erase(treap *&root, int pos) {
  148. if(pos < get_size(root->left)) {
  149. erase(root->left, pos);
  150. }
  151. else if(pos > get_size(root->left)) {
  152. erase(root->right, pos - get_size(root->left) - 1);
  153. }
  154. else {
  155. root = merge(root->left, root->right);
  156. }
  157. update(root);
  158. }
  159.  
  160. int get(treap *&root, int pos) {
  161. if(pos < get_size(root->left)) {
  162. return get(root->left, pos);
  163. }
  164. else if(pos > get_size(root->left)) {
  165. return get(root->right, pos - get_size(root->left) - 1);
  166. }
  167. else {
  168. return get_val2(root);
  169. }
  170. }
  171.  
  172. signed main() {
  173. seriy();
  174. int n, p;
  175. cin >> n >> p;
  176. vector<int> a(n);
  177. treap *root = nullptr;
  178. // print(root);
  179. int cnt = n;
  180. pair<treap*, treap*> splitted = split(root, 0);
  181. for(int i = 0; i < n; i++) {
  182. cin >> a[i];
  183. insert(root, i, a[i]);
  184. // cerr << root->sz << '\n';
  185. }
  186. // print(root);
  187. cout << root->sum << '\n';
  188. int q;
  189. cin >> q;
  190. while(q--) {
  191. int t, pos;
  192. cin >> t >> pos;
  193. pos--;
  194. if(t == 2) {
  195. int w = get(root, pos);
  196. erase(root, pos);
  197. insert(root, pos, (w + 1) / 2);
  198. insert(root, pos, w / 2);
  199. cnt++;
  200. }
  201. else {
  202. if(pos == 0) {
  203. int a = get(root, 0);
  204. int b = get(root, 1);
  205. erase(root, 0);
  206. erase(root, 0);
  207. int nv = (a + b);
  208. // cerr << nv << '\n';
  209. insert(root, 0, nv);
  210. }
  211. else if(pos == cnt - 1) {
  212. int a = get(root, cnt - 1);
  213. int b = get(root, cnt - 2);
  214. erase(root, cnt - 2);
  215. erase(root, cnt - 2);
  216. int nv = a + b;
  217. insert(root, cnt - 2, nv);
  218. }
  219. else {
  220. int a = get(root, pos - 1);
  221. int b = get(root, pos + 1);
  222. int w = get(root, pos);
  223. erase(root, pos - 1);
  224. erase(root, pos - 1);
  225. erase(root, pos - 1);
  226. int nv1 = b + (w + 1) / 2;
  227. int nv2 = a + w / 2;
  228. insert(root, pos - 1, nv1);
  229. insert(root, pos - 1, nv2);
  230. }
  231. cnt--;
  232. }
  233. cout << root->sum << '\n';
  234. }
  235. return 0;
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement