Advertisement
Guest User

Untitled

a guest
Dec 29th, 2019
1,419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.51 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. class SegTree {
  6. private:
  7. int n;
  8. vector<int> val, cnt, lazy;
  9.  
  10. void push(int x, int l, int r) {
  11. if (lazy[x] == 0) return;
  12. val[x] += lazy[x];
  13. if (l != r) {
  14. lazy[x * 2] += lazy[x];
  15. lazy[x * 2 + 1] += lazy[x];
  16. }
  17. lazy[x] = 0;
  18. }
  19.  
  20. void merge(int x) {
  21. if (val[x*2] == val[x*2+1]) {
  22. val[x] = val[x*2];
  23. cnt[x] = cnt[x*2] + cnt[x*2+1];
  24. } else if (val[x*2] < val[x*2+1]) {
  25. val[x] = val[x*2];
  26. cnt[x] = cnt[x*2];
  27. } else {
  28. val[x] = val[x*2+1];
  29. cnt[x] = cnt[x*2+1];
  30. }
  31. }
  32.  
  33. void recount(int x, int tl, int tr, int pos, int delta) {
  34. push(x, tl, tr);
  35. if (tl == tr) {
  36. cnt[x] += delta;
  37. return;
  38. }
  39. int tm = (tl + tr) / 2;
  40. if (pos <= tm) {
  41. recount(x * 2, tl, tm, pos, delta);
  42. push(x * 2 + 1, tm + 1, tr);
  43. } else {
  44. push(x * 2, tl, tm);
  45. recount(x * 2 + 1, tm + 1, tr, pos, delta);
  46. }
  47. merge(x);
  48. }
  49.  
  50. void update(int x, int tl, int tr, int l, int r, int val) {
  51. push(x, tl, tr);
  52. if (l > r) return;
  53. if (l == tl && tr == r) {
  54. lazy[x] += val;
  55. push(x, tl, tr);
  56. return;
  57. }
  58. int tm = (tl + tr) / 2;
  59. update(x * 2, tl, tm, l, min(r, tm), val);
  60. update(x * 2 + 1, tm + 1, tr, max(tm + 1, l), r, val);
  61. merge(x);
  62. }
  63.  
  64. int query(int x, int tl, int tr, int l, int r) {
  65. push(x, tl, tr);
  66. if (l == tl && tr == r) {
  67. return val[x] == 1 ? cnt[x] : 0;
  68. }
  69. int tm = (tl + tr) / 2;
  70. if (r <= tm) {
  71. return query(x * 2, tl, tm, l, r);
  72. } else if (l > tm) {
  73. return query(x * 2 + 1, tm + 1, tr, l, r);
  74. } else {
  75. return query(x * 2, tl, tm, l, tm) +
  76. query(x * 2 + 1, tm + 1, tr, tm + 1, r);
  77. }
  78. }
  79. public:
  80. inline void update(int l, int r, int val) {
  81. update(1, 0, n - 1, l, r, val);
  82. }
  83.  
  84. inline int query(int l, int r) {
  85. return query(1, 0, n - 1, l, r);
  86. }
  87.  
  88. inline void recount(int pos, int val) {
  89. recount(1, 0, n - 1, pos, val);
  90. }
  91.  
  92. SegTree(int n) : n(n), val(4*n), cnt(4*n), lazy(4*n) {}
  93. };
  94.  
  95. int main() {
  96. ios_base::sync_with_stdio(false);
  97.  
  98. int n, q; cin >> n >> q;
  99. vector<int> a(n + 2);
  100. int mx = 0;
  101. for (int i = 0; i < n; ++i) {
  102. cin >> a[i+1];
  103. mx = max(mx, a[i+1]);
  104. }
  105. a[n+1] = 0;
  106. vector<int> pos(q), x(q);
  107. for (int i = 0; i < q; ++i) {
  108. cin >> pos[i] >> x[i];
  109. mx = max(mx, x[i]);
  110. }
  111. a[0] = mx+1;
  112.  
  113. ++n;
  114. SegTree segTree(a[0] + 1);
  115.  
  116. auto addDiff = [&](int a, int b, int sgn) {
  117. if (a == b) return;
  118. segTree.update(min(a, b), max(a, b) - 1, sgn);
  119. };
  120.  
  121. for (int i = 0; i < n; ++i) {
  122. addDiff(a[i], a[i + 1], +1);
  123. segTree.recount(a[i], +1);
  124. }
  125. for (int i = 0; i < q; ++i) {
  126. int p = pos[i], y = x[i];
  127. segTree.recount(a[p], -1);
  128. addDiff(a[p - 1], a[p], -1);
  129. addDiff(a[p], a[p + 1], -1);
  130. segTree.recount(y, +1);
  131. addDiff(a[p - 1], y, +1);
  132. addDiff(y, a[p + 1], +1);
  133. a[p] = y;
  134. cout << segTree.query(1, a[0] - 1) << "\n";
  135. }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement