Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. struct segment_tree{
  2. vector < int > t;
  3. int siz;
  4. void build(int siz1) {
  5. siz = siz1;
  6. t.resize(4 * siz);
  7. return ;
  8. }
  9. int reask(int v, int l, int r, int tl, int tr) {
  10. if (l == tl && r == tr) {
  11. return t[v];
  12. }
  13. int m = (l + r) / 2;
  14. int ret = 0;
  15. if (tl <= m) ret += reask(v * 2 + 1, l, m, tl, min(m, tr));
  16. if (tr >= m + 1) ret += reask(v * 2 + 2, m + 1, r, max(m + 1, tl), tr);
  17. return ret;
  18. }
  19. int ask(int l, int r) {
  20. return reask(0, 0, siz - 1, l, r);
  21. }
  22. void reupd(int v, int l, int r, int pos, int val) {
  23. if (l == r) {
  24. t[v] = val;
  25. return ;
  26. }
  27. int m = (l + r) / 2;
  28. if (pos <= m) reupd(v * 2 + 1, l, m, pos, val);
  29. else reupd(v * 2 + 2, m + 1, r, pos, val);
  30. t[v] = t[v * 2 + 1] + t[v * 2 + 2];
  31. }
  32. void upd(int pos, int val) {
  33. reupd(0, 0, siz - 1, pos, val);
  34. }
  35.  
  36. };
  37. struct type {
  38. bool isupd;
  39. int x, ind;
  40. int priority;
  41. /// сколько чисел на отрезке больше, чем x?
  42. /// or {a[i], i} = {x, ind}
  43. };
  44. int n, q, k;
  45. vector < int > nxt, lft;
  46. vector < int > a;
  47. void precalc() {
  48. nxt.resize(n);
  49. lft.resize(n);
  50. vector < pair < int, int > > buba;
  51. buba.resize(n);
  52. fori(n) buba[i] = {a[i], i};
  53. sort(all(buba));
  54. int r = n - 1;
  55. set < int > s;
  56. for (int i = n - 1; i >= 0; i--) {
  57. while (true) {
  58. if (buba[r].ff - buba[i].ff <= k) break;
  59. s.erase(buba[r].ss);
  60. r--;
  61. }
  62. auto c = s.upper_bound(buba[i].ss);
  63. if (c != s.end()) {
  64. nxt[buba[i].ss] = *c;
  65. } else {
  66. nxt[buba[i].ss] = n;
  67. }
  68. if (c != s.begin()) {
  69. c--;
  70. lft[buba[i].ss] = *c;
  71. } else {
  72. lft[buba[i].ss] = -1;
  73. }
  74. s.insert(buba[i].ss);
  75. }
  76. }
  77. int main() {
  78. srand(time(NULL));
  79. cin >> n >> q >> k;
  80. a.resize(n);
  81. nxt.resize(n);
  82. lft.resize(n);
  83. fori(n) cin >> a[i];
  84. vector < vector < int > > jmp;
  85. jmp.resize(n);
  86. precalc();
  87. fori(n) {
  88. if (lft[i] == -1) continue;
  89. jmp[lft[i]].pb(i);
  90. }
  91. vector < vector < pair < int, int > > > ask; //ask[l] = {{r, ind}, {r, ind}...}
  92. ask.resize(n);
  93. fori(q) {
  94. int l, r;
  95. cin >> l >> r;
  96. l--; r--;
  97. ask[l].pb({r, i});
  98. }
  99. vector < int > ans;
  100. ans.resize(q);
  101. int cur = 0;
  102. vector < vector < type > > another_ask;
  103. fori(n) cout << nxt[i] << " ";
  104. cout << "\n";
  105. for (int i = n - 1; i >= 0; i--) {
  106. for (auto to: jmp[i]) {
  107. cout << "upd " << nxt[to] << "\n";
  108. nxt[to] = -1;
  109. }
  110. for (int j = 0; j < ask[i].size(); j++) {
  111. int r = ask[i][j].ff;
  112. cur = 0;
  113. for (int z = i; z <= r; z++) {
  114. if (nxt[z] > r) cur++;
  115. }
  116. cout << "ask " << i << " " << r << "more than " << r << " = " << cur << "\n";
  117. ans[ask[i][j].ss] = cur;
  118. }
  119. }
  120. fori(ans.size()) cout << ans[i] << " ";
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement