Advertisement
GerONSo

F 37

Jan 9th, 2020
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.39 KB | None | 0 0
  1. /*
  2.  
  3. ∧_∧
  4. ( ・ω・。)つ━☆・*。
  5. ⊂  ノ    ・゜
  6. しーJ   Accepted
  7.  
  8. */
  9.  
  10.  
  11.  
  12. // #pragma GCC optimize("O3")
  13. // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  14.  
  15. #include <bits/stdc++.h>
  16. #include <ext/pb_ds/assoc_container.hpp>
  17. #include <ext/pb_ds/tree_policy.hpp>
  18.  
  19. #define ll long long
  20. #define all(x) begin(x), end(x)
  21. #define x first
  22. #define y second
  23. #define int long long
  24.  
  25. using namespace std;
  26. using namespace __gnu_pbds;
  27.  
  28. typedef long double ld;
  29. template<typename T>
  30. using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
  31.  
  32. const ld PI = atan2(0, -1);
  33.  
  34. void seriy() {
  35. ios::sync_with_stdio(0);
  36. cin.tie(0);
  37. cout.tie(0);
  38. cout << fixed << setprecision(14);
  39. #ifdef _offline
  40. freopen("input.txt", "r", stdin);
  41. freopen("output.txt", "w", stdout);
  42. #endif
  43. }
  44.  
  45. const int MAXN = 1e6;
  46. const int MAXM = 600;
  47. const int INF = 1e18 + 7;
  48. const int BASE = 47;
  49. const int MOD = 1e9 + 7;
  50. const int MAXLOG = 51;
  51. const ld EPS = 1e-6;
  52.  
  53. struct node {
  54. int mx, pos;
  55. };
  56.  
  57. struct rq {
  58. int l, r, num;
  59. };
  60.  
  61. vector<node> t(4 * MAXN, {-INF, INF});
  62. int cur = 1;
  63. int n, q, k;
  64.  
  65. node get(int v, int tl, int tr, int l, int r) {
  66. if(tl > r || tr < l) {
  67. return {-INF, INF};
  68. }
  69. if(tl >= l && tr <= r) {
  70. return t[v];
  71. }
  72. int tm = (tl + tr) >> 1;
  73. node left = get(v * 2 + 1, tl, tm, l, r);
  74. node right = get(v * 2 + 2, tm + 1, tr, l, r);
  75. if(left.mx > right.mx) {
  76. return left;
  77. }
  78. else {
  79. return right;
  80. }
  81. }
  82.  
  83. void update(int v, int tl, int tr, int pos, int val) {
  84. if(tl > pos || tr < pos) {
  85. return;
  86. }
  87. if(tl == tr) {
  88. t[v] = {val, n - val};
  89. return;
  90. }
  91. int tm = (tl + tr) >> 1;
  92. update(v * 2 + 1, tl, tm, pos, val);
  93. update(v * 2 + 2, tm + 1, tr, pos, val);
  94. if(t[v * 2 + 1].mx > t[v * 2 + 2].mx) {
  95. t[v] = t[v * 2 + 1];
  96. }
  97. else {
  98. t[v] = t[v * 2 + 2];
  99. }
  100. }
  101.  
  102. signed main() {
  103. seriy();
  104. cin >> n >> q >> k;
  105. vector<int> a(n);
  106. vector<pair<int, int>> lol(n);
  107. for(int i = 0; i < n; i++) {
  108. cin >> a[i];
  109. lol[i] = {a[i], a[i]};
  110. }
  111. vector<int> b = a;
  112. b.push_back(INF);
  113. b.push_back(-INF);
  114. sort(all(b));
  115. vector<rq> req(q);
  116. vector<vector<pair<int, int>>> rr(n);
  117. for(int j = 0; j < q; j++) {
  118. int l, r;
  119. cin >> l >> r;
  120. l--;
  121. r--;
  122. rr[l].push_back({r, j});
  123. req[j] = {l, r, j};
  124. }
  125. vector<int> res(q);
  126. vector<pair<int, int>> close(n, {-INF, INF});
  127. for(int i = n - 1; i >= 0; i--) {
  128. int pos = lower_bound(all(b), a[i]) - b.begin();
  129. int pos3 = upper_bound(all(b), lol[i].y + k) - b.begin() - 1;
  130. close[i].y = get(0, 0, b.size() - 1, pos, pos3).pos;
  131. // cerr << close[i].y << " ";
  132. // for(auto j : rr[i]) {
  133. // int ans = 0;
  134. // for(int p = i; p <= j.x; p++) {
  135. // if(close[p].x <= j.x && (close[close[p].x].x > j.x)) ans++;
  136. // if(close[p].y <= j.x && (close[close[p].y].y > j.x)) ans++;
  137. // }
  138. // res[j.y] = ans;
  139. // }
  140. update(0, 0, b.size() - 1, pos, cur);
  141. cur++;
  142. }
  143. cur = 0;
  144. fill(all(t), node{-INF, INF});
  145. for(int i = 0; i < n; i++) {
  146. int pos = lower_bound(all(b), a[i]) - b.begin();
  147. int pos3 = upper_bound(all(b), lol[i].y + k) - b.begin() - 1;
  148. close[i].x = get(0, 0, b.size() - 1, pos, pos3).mx;
  149. if(close[i].x == INF) close[i].x = -INF;
  150. // cerr << close[i].y << " ";
  151. // for(auto j : rr[i]) {
  152. // int ans = 0;
  153. // for(int p = i; p <= j.x; p++) {
  154. // if(close[p].x <= j.x && (close[close[p].x].x > j.x)) ans++;
  155. // if(close[p].y <= j.x && (close[close[p].y].y > j.x)) ans++;
  156. // }
  157. // res[j.y] = ans;
  158. // }
  159. update(0, 0, b.size() - 1, pos, cur);
  160. cur++;
  161. }
  162. for(int i = 0; i < q; i++) {
  163. // cerr << res[i] << " ";
  164. for(int j = req[i].l; j <= req[i].r; j++) {
  165. if(close[j].x < req[i].l && close[j].y > req[i].r) res[i]++;
  166. }
  167. cout << res[i] << " ";
  168. // cout << req[i].r - req[i].l + 1 - res[i] << " ";
  169. }
  170.  
  171. return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement