Advertisement
Tvor0zhok

Дерево отрезков

Jul 29th, 2021 (edited)
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <utility>
  5. #include <vector>
  6. #include <string>
  7. #include <cmath>
  8. #include <set>
  9. #include <map>
  10. using namespace std;
  11.  
  12. typedef long long ll;
  13. typedef pair <int, int> ii;
  14. typedef vector <int> vi;
  15. typedef vector <ii> vii;
  16.  
  17. class SegmentTree
  18. {
  19. private: vii st; int n;
  20.  
  21. void build (int p, int L, int R)
  22. {
  23. if (L == R) st[p] = { a[L], 1 };
  24. else
  25. {
  26. build(2*p, L, (L + R) / 2);
  27. build(2*p + 1, (L + R) / 2 + 1, R);
  28.  
  29. ii p1 = st[2*p], p2 = st[2*p + 1];
  30.  
  31. if (p1.first == p2.first) st[p] = { p1.first, p1.second + p2.second };
  32. else if (p1.first > p2.first) st[p] = p1;
  33. else st[p] = p2;
  34. }
  35. }
  36.  
  37. void replace (int p, int L, int R, int i, int num)
  38. {
  39. if (L == R && R == i) st[p] = {num, 1};
  40. else if (L <= i && i <= R)
  41. {
  42. replace(2*p, L, (L+R) / 2, i, num);
  43. replace(2*p + 1, (L+R) / 2 + 1, R, i, num);
  44.  
  45. ii p1 = st[2*p], p2 = st[2*p + 1];
  46.  
  47. if (p1.first == p2.first) st[p] = { p1.first, p1.second + p2.second };
  48. else if (p1.first > p2.first) st[p] = p1;
  49. else st[p] = p2;
  50. }
  51. }
  52.  
  53. ii task (int p, int L, int R, int i, int j)
  54. {
  55. if (i > R || j < L) return {0, -1};
  56. if (L >= i && R <= j) return st[p];
  57.  
  58. ii p1 = task(2*p, L, (L + R) / 2, i, j);
  59. ii p2 = task(2*p + 1, (L + R) / 2 + 1, R, i, j);
  60.  
  61. if (p1.second == -1) return p2;
  62. if (p2.second == -1) return p1;
  63.  
  64. if (p1.first == p2.first) return { p1.first, p1.second + p2.second };
  65. else if (p1.first > p2.first) return p1;
  66. else return p2;
  67. }
  68.  
  69. public: vi a;
  70.  
  71. SegmentTree (int N)
  72. {
  73. n = N; a.assign(n, 0); st.assign(4*n, {0,0});
  74.  
  75. for (int i = 0; i < n; ++i) cin >> a[i];
  76.  
  77. build(1, 0, n - 1);
  78. }
  79.  
  80. ii task(int i, int j) { return task(1, 0, n - 1, i, j); }
  81.  
  82. void replace (int i, int num) { replace(1, 0, n - 1, i, num); }
  83. };
  84.  
  85. int main()
  86. {
  87. ios_base :: sync_with_stdio(false);
  88. cin.tie(nullptr);
  89.  
  90. int n; cin >> n;
  91.  
  92. SegmentTree ST(n);
  93.  
  94. int k; cin >> k;
  95.  
  96. for (int i = 0; i < k; ++i)
  97. {
  98. char c; cin >> c; int a, b; cin >> a >> b;
  99.  
  100. if (c == 's') cout << ST.task(a - 1, b - 1).second << " ";
  101. else ST.replace(a - 1, b);
  102. }
  103.  
  104. return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement