Advertisement
prog3r

https://basecamp.eolymp.com/ru/compete/ajbi7s2jld37fch2ulvjkvgi9g/problem/3

Mar 3rd, 2025 (edited)
13
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. signed main() {
  4. struct Node {
  5. int max = 1e9;
  6. int l = -1, r = -1;
  7. };
  8. vector<Node> tree;
  9. tree.reserve(10'000'000);
  10. auto get_max = [&] (auto f, int u, int tl, int tr, int l, int r) -> int {
  11. if (u == -1) {
  12. return 1e9;
  13. }
  14. if (tl == l && tr == r) {
  15. return tree[u].max;
  16. }
  17. int tm = (tl + tr) >> 1;
  18. int ret = -1e9;
  19. if (l <= tm) {
  20. ret = max(ret, f(f, tree[u].l, tl, tm, l, min(tm, r)));
  21. }
  22. if (r >= tm+1) {
  23. ret = max(ret, f(f, tree[u].r, tm+1, tr, max(l, tm+1), r));
  24. }
  25. return ret;
  26. };
  27. auto recalc = [&] (int ul, int ur) -> int {
  28. int val = -1e9;
  29. if (ul != -1) {
  30. val = max(val, tree[ul].max);
  31. } else {
  32. val = max(val, (int)1e9);
  33. }
  34. if (ur != -1) {
  35. val = max(val, tree[ur].max);
  36. } else {
  37. val = max(val, (int)1e9);
  38. }
  39. tree.push_back({val, ul, ur});
  40. return tree.size()-1;
  41. };
  42. auto set = [&] (auto f, int u, int tl, int tr, int pos, int val) -> int {
  43. int currL = u == -1 ? -1 : tree[u].l;
  44. int currR = u == -1 ? -1 : tree[u].r;
  45. if (tl == tr) {
  46. tree.push_back({val});
  47. return tree.size()-1;
  48. }
  49. int tm = (tl + tr) >> 1;
  50. if (pos <= tm) {
  51. return recalc(f(f, currL, tl, tm, pos, val), currR);
  52. } else {
  53. return recalc(currL, f(f, currR, tm+1, tr, pos, val));
  54. }
  55. };
  56. int n, L, R;
  57. cin >> n >> L >> R;
  58. vector<int> a(n);
  59. for (auto &x : a) {
  60. cin >> x;
  61. }
  62. vector<int> trees(n+1);
  63. trees[n] = -1;
  64. for (int i = n-1; i >= 0; i -= 1) {
  65. trees[i] = set(set, trees[i+1], 0, n, a[i], i);
  66. }
  67. clog << "SZ = " << tree.size() << "\n";
  68. vector<vector<int>> pos(n+2);
  69. for (int i = 0; i < n; i += 1) {
  70. pos[a[i]].push_back(i);
  71. }
  72. int zero = count(a.begin(), a.end(), 0);
  73. for (int i = 0; i <= n; i += 1) {
  74. pos[i].push_back(n);
  75. }
  76. for (int i = L; i <= R; i += 1) {
  77. if (i == 0) {
  78. cout << n-zero << " ";
  79. continue;
  80. }
  81. int start = 0;
  82. int tot = 0;
  83. for (int j = 0; j < pos[i].size(); j += 1) {
  84. while (true) {
  85. int nxt = get_max(get_max, trees[start], 0, n, 0, i-1);
  86. if (nxt < pos[i][j]) {
  87. tot += 1;
  88. }
  89. start = nxt + 1;
  90. if (start >= pos[i][j]) {
  91. break;
  92. }
  93. }
  94. start = pos[i][j] + 1;
  95. }
  96. cout << tot << " ";
  97. }cout << "\n";
  98. clog << "SZ = " << tree.size() << "\n";
  99. }
  100.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement