Advertisement
GerONSo

Untitled

Nov 4th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.43 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. #endif
  43. }
  44.  
  45. const int MAXN = 1e6 + 10;
  46. const int MAXM = 600;
  47. const int INF = 1e18;
  48. const int BASE = 47;
  49. const int MOD = 1e9 + 7;
  50. const int MAXLOG = 21;
  51.  
  52. mt19937 rr(47);
  53.  
  54. struct treap {
  55. treap *left = nullptr;
  56. treap *right = nullptr;
  57. int sum, prior, sz;
  58.  
  59. treap(int sum) {
  60. this->sum = sum;
  61. this->prior = rr();
  62. this->sz = 1;
  63. }
  64. };
  65.  
  66. int get_size(treap *&root) {
  67. return ((root == nullptr) ? 0 : root->sz);
  68. }
  69.  
  70. int get_val(treap *&root) {
  71. return ((root == nullptr) ? 0 : root->sum);
  72. }
  73.  
  74. void update(treap *&root) {
  75. if(root == nullptr) return;
  76. if(root->left == nullptr && root->right == nullptr) {
  77. return;
  78. }
  79. int add_l = 0;
  80. int add_r = 0;
  81.  
  82. int sum_l = 0;
  83. int sum_r = 0;
  84.  
  85. if(root->left != nullptr) {
  86. add_l = root->left->sz;
  87. sum_l = root->left->sum;
  88. }
  89. if(root->right != nullptr) {
  90. add_r = root->right->sz;
  91. sum_r = root->right->sum;
  92. }
  93. root->sz = add_l + add_r + 1;
  94. root->sum = sum_l + sum_r;
  95. }
  96.  
  97. void split(treap *&root, treap *&left, treap *&right, int key) {
  98. if(root == nullptr) {
  99. left = nullptr;
  100. right = nullptr;
  101. return;
  102. }
  103. int root_key = get_size(root->left);
  104. if(key > root_key) {
  105. split(root->right, root->right, right, key);
  106. left = root;
  107. }
  108. else {
  109. split(root->left, left, root->left, key);
  110. right = root;
  111. }
  112. update(root);
  113. }
  114.  
  115. treap* merge(treap *&left, treap *&right) {
  116. if(left == nullptr) {
  117. return right;
  118. }
  119. if(right == nullptr) {
  120. return left;
  121. }
  122. if(left->prior > right->prior) {
  123. left->right = merge(left->right, right);
  124. update(left);
  125. update(right);
  126. return left;
  127. }
  128. else {
  129. right->left = merge(left, right->left);
  130. update(right);
  131. update(left);
  132. return right;
  133. }
  134. }
  135.  
  136. void insert(treap *&root, int pos, int val) {
  137. treap *left = nullptr, *right = nullptr;
  138. split(root, left, right, pos);
  139. treap *nw = new treap(val * val);
  140. left = merge(left, nw);
  141. update(left);
  142. // cerr << get_val(left) << '\n';
  143. left = merge(left, right);
  144. update(left);
  145. // cerr << get_val(left) << '\n';
  146. root = left;
  147. }
  148.  
  149. treap* erase(treap *root, int pos) {
  150. if(pos < root->sz) {
  151. erase(root->left, pos);
  152. }
  153. else if(pos > root->sz) {
  154. erase(root->right, pos);
  155. }
  156. else {
  157. root = merge(root->left, root->right);
  158. update(root);
  159. }
  160. }
  161.  
  162. int get(treap *root, int pos) {
  163. if(pos < root->sz) {
  164. return get(root->left, pos);
  165. }
  166. else if(pos > root->sz) {
  167. return get(root->right, pos);
  168. }
  169. else {
  170. return root->sum;
  171. }
  172. }
  173.  
  174. signed main() {
  175. seriy();
  176. int n, p;
  177. cin >> n >> p;
  178. vector<int> a(n);
  179. treap *root = nullptr;
  180. insert(root, 0, 2);
  181. insert(root, 0, 3);
  182. treap *left = nullptr, *right = nullptr;
  183. // split(root, left, right, 0);
  184. // cerr << root->sum << '\n';
  185. for(int i = 0; i < n; i++) {
  186. cin >> a[i];
  187. // insert(root, i, a[i]);
  188. // cerr << root->sz << '\n';
  189. }
  190. // int q;
  191. // cin >> q;
  192. // while(q--) {
  193. // int t, pos;
  194. // cin >> t >> pos;
  195. // pos--;
  196. // int w = get(root, pos);
  197. // erase(root, pos);
  198. // insert(root, pos, (w + 1) / 2);
  199. // insert(root, pos, w / 2);
  200. // cout << root->sum << '\n';
  201. // }
  202. return 0;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement