Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define lsb(x) (x & (-x))
  3. #define ll long long
  4. #define ull unsigned long long
  5. // 220
  6. // 44
  7.  
  8. using namespace std;
  9.  
  10. const int MAXN = (int) 1e5;
  11.  
  12. ll dst[2 * MAXN + 1], tot;
  13. int chain[2 * MAXN + 1], root[2 * MAXN + 1], ord[2 * MAXN + 1];
  14. int nodes, chains, n;
  15.  
  16. struct Data {
  17. int nod;
  18. bool operator <(const Data &other) const {
  19. if(dst[nod] == dst[other.nod])
  20. return ord[nod] > ord[other.nod];
  21. return dst[nod] > dst[other.nod];
  22. }
  23. };
  24.  
  25. multiset <Data> mst[MAXN + 1];
  26.  
  27. int aint[4 * MAXN + 1];
  28.  
  29. void build(int nod, int left, int right) {
  30. if(left == right) {
  31. mst[left].insert({left});
  32. aint[nod] = left;
  33. }
  34. else {
  35. int mid = (left + right) / 2;
  36. build(2 * nod, left, mid);
  37. build(2 * nod + 1, mid + 1, right);
  38. if(dst[aint[2 * nod]] <= dst[aint[2 * nod + 1]])
  39. aint[nod] = aint[2 * nod + 1];
  40. else
  41. aint[nod] = aint[2 * nod];
  42. }
  43. }
  44.  
  45. void insert(int nod, int left, int right) {
  46. if(left == right) {
  47. mst[left].insert({nodes});
  48. if(dst[aint[nod]] <= dst[nodes])
  49. aint[nod] = nodes;
  50. }
  51. else {
  52. int mid = (left + right) / 2;
  53. if(root[nodes] <= mid)
  54. insert(2 * nod, left, mid);
  55. else
  56. insert(2 * nod + 1, mid + 1, right);
  57. int a = aint[2 * nod], b = aint[2 * nod + 1];
  58. if(dst[a] > dst[b] || (dst[a] == dst[b] && ord[a] > ord[b])) {
  59. aint[nod] = a;
  60. }
  61. else {
  62. aint[nod] = b;
  63. }
  64. }
  65. }
  66.  
  67. void erase(int nod, int left, int right, int id) {
  68. if(left == right) {
  69. mst[left].erase(mst[left].find({id}));
  70. aint[nod] = mst[left].begin() -> nod;
  71. }
  72. else {
  73. int mid = (left + right) / 2;
  74. if(root[id] <= mid)
  75. erase(2 * nod, left, mid, id);
  76. else
  77. erase(2 * nod + 1, mid + 1, right, id);
  78. int a = aint[2 * nod], b = aint[2 * nod + 1];
  79. if(dst[a] > dst[b] || (dst[a] == dst[b] && ord[a] > ord[b])) {
  80. aint[nod] = a;
  81. }
  82. else {
  83. aint[nod] = b;
  84. }
  85. }
  86. }
  87.  
  88. int query(int nod, int left, int right, int l, int r) {
  89. if(l > r)
  90. return 0;
  91. if(l <= left && right <= r) {
  92. return aint[nod];
  93. }
  94. else {
  95. int mid = (left + right) / 2;
  96. int a = 0, b = 0;
  97. if(l <= mid)
  98. a = query(2 * nod, left, mid, l, r);
  99. if(mid < r)
  100. b = query(2 * nod + 1, mid + 1, right, l, r);
  101. if(dst[a] < dst[b])
  102. return b;
  103. return a;
  104. }
  105. }
  106.  
  107. inline void add(int y, int w, int t) {
  108. nodes++;
  109. if(y <= n) {
  110. chain[nodes] = ++chains;
  111. }
  112. else {
  113. chain[nodes] = chain[y];
  114. }
  115. root[nodes] = root[y];
  116. dst[nodes] = dst[y] + w;
  117. ord[nodes] = t;
  118. insert(1, 1, n);
  119. }
  120.  
  121. inline void del(int y) {
  122. erase(1, 1, n, y);
  123. }
  124.  
  125. inline int get_farthest(int x) {
  126. int pos = root[x];
  127. int nod2 = query(1, 1, n, pos + 1, n), nod1 = query(1, 1, n, 1, pos - 1);
  128. ll dst2 = dst[nod2] - dst[x];
  129. ll dst1 = tot + (dst[nod1] - dst[x]);
  130. if(nod1 == 0)
  131. dst1 = 0;
  132. if(nod2 == 0)
  133. dst2 = 0;
  134. if(dst1 > dst2)
  135. return nod1;
  136. return nod2;
  137. }
  138.  
  139. int main() {
  140. //ifstream cin("A.in");
  141. //ofstream cout("A.out");
  142. int i, w, m;
  143. ios::sync_with_stdio(false);
  144. cin >> n;
  145. for(i = 2; i <= n + 1; i++) {
  146. cin >> w;
  147. dst[i] = dst[i - 1] + w;
  148. tot += w;
  149. }
  150. for(i = 1; i <= n; i++) {
  151. chain[i] = i;
  152. root[i] = i;
  153. ord[i] = i;
  154. }
  155. build(1, 1, n);
  156. cin >> m;
  157. nodes = chains = n;
  158. for(int t = n + 1; t <= m + n; t++) {
  159. int type, x;
  160. cin >> type >> x;
  161. if(type == 1) {
  162. cin >> w;
  163. int y = get_farthest(x);
  164. add(y, w, t);
  165. }
  166. if(type == 2) {
  167. cin >> w;
  168. add(x, w, t);
  169. }
  170. if(type == 3) {
  171. int y = get_farthest(x);
  172. del(y);
  173. }
  174. if(type == 4) {
  175. int y = get_farthest(x);
  176. ll ans;
  177. if(root[y] >= x) {
  178. ans = dst[y] - dst[x];
  179. }
  180. else {
  181. ans = dst[y] - dst[x] + tot;
  182. }
  183. cout << ans << "\n";
  184. }
  185. }
  186. //cin.close();
  187. //cout.close();
  188. return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement