GerONSo

F 88

Jan 9th, 2020
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.21 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 + 10;
  46. const int MAXM = 600;
  47. const int INF = 1e9 + 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. int f_get(vector<int> &t, int pos) {
  103. int sum = 0;
  104. if(pos >= t.size()) {
  105. return f_get(t, t.size() - 1);
  106. }
  107. while(pos > 0) {
  108. sum += t[pos];
  109. pos -= (pos & (-pos));
  110. }
  111. return sum;
  112. }
  113.  
  114. void f_update(vector<int> &t, int pos, int val) {
  115. while(pos < t.size()) {
  116. t[pos] += val;
  117. pos += (pos & (-pos));
  118. }
  119. }
  120.  
  121. signed main() {
  122. seriy();
  123. cin >> n >> q >> k;
  124. vector<int> a(n);
  125. vector<pair<int, int>> lol(n);
  126. for(int i = 0; i < n; i++) {
  127. cin >> a[i];
  128. lol[i] = {a[i], a[i]};
  129. }
  130.  
  131. vector<int> b = a;
  132. b.push_back(INF);
  133. b.push_back(-INF);
  134. sort(all(b));
  135. vector<rq> close(n, {-INF, INF});
  136. for(int i = n - 1; i >= 0; i--) {
  137. int pos = lower_bound(all(b), a[i]) - b.begin();
  138. int pos3 = upper_bound(all(b), lol[i].y + k) - b.begin() - 1;
  139. close[i].r = get(0, 0, b.size() - 1, pos, pos3).pos;
  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].l = get(0, 0, b.size() - 1, pos, pos3).mx;
  149. if(close[i].l == INF) close[i].l = -INF;
  150. close[i].num = i;
  151. update(0, 0, b.size() - 1, pos, cur);
  152. cur++;
  153. }
  154.  
  155. vector<rq> req(q);
  156. vector<vector<pair<int, int>>> rr(n);
  157. for(int j = 0; j < q; j++) {
  158. int l, r;
  159. cin >> l >> r;
  160. l--;
  161. r--;
  162. rr[r].push_back({l, j});
  163. req[j] = {l, r, j};
  164. }
  165. for(int i = 0; i < n; i++) {
  166. sort(all(rr[i]), greater<pair<int, int>>());
  167. }
  168. vector<rq> close2 = close;
  169. vector<rq> close3 = close;
  170. sort(all(close2), [&](rq a, rq b) {
  171. return a.r < b.r || a.r == b.r && a.l > b.l;
  172. });
  173. sort(all(close3), [&](rq a, rq b) {
  174. return a.l > b.l || a.l == b.l && a.r < b.r;
  175. });
  176. // for(auto i : close3) {
  177. // cerr << i.l << " " << i.r << " " << i.num << '\n';
  178. // }
  179. // cerr << '\n';
  180. vector<int> res(q);
  181. vector<int> inside(MAXN);
  182. vector<int> right(MAXN), left(MAXN);
  183. int cur_r = 0, cur_l = 0, was = 0;
  184. sort(all(req), [&](rq a, rq b) {
  185. return a.l > b.l || a.l == b.l && a.r < b.r;
  186. });
  187. vector<int> kek_right(q);
  188. for(auto i : req) {
  189. while(cur_l < close3.size() && close3[cur_l].l >= i.l) {
  190. f_update(right, close3[cur_l].num + 1, 1);
  191. cur_l++;
  192. }
  193. // int cnt1 = 0;
  194. // for(int p = i.l; p <= i.r; p++) {
  195. // if(close[p].l >= i.l) cnt1++;
  196. // }
  197. // cerr << cur_l << " " << (f_get(right, right.size() - 1) - f_get(right, i.r + 1)) << '\n';
  198. int lol_right = cur_l - (f_get(right, right.size() - 1) - f_get(right, i.r + 1));
  199. // cerr << i.l << " " << i.r << " " << cnt1 << " " << lol_right << '\n';
  200. kek_right[i.num] = lol_right;
  201. }
  202. for(int i = 0; i < n; i++) {
  203. for(auto j : rr[i]) {
  204. int r = i;
  205. int l = j.x;
  206. int num = j.y;
  207. int cnt1 = 0, cnt_inf = 0;
  208. while(cur_r < close2.size() && close2[cur_r].r <= r) {
  209. // cerr << close[cur_r].l + 1 << " ";
  210. f_update(left, close2[cur_r].num + 1, 1);
  211. f_update(inside, close2[cur_r].l + 1, 1);
  212. cur_r++;
  213. }
  214. // // cerr << '\n';
  215. int in = f_get(inside, r + 1) - f_get(inside, l);
  216. int kek_left = cur_r - f_get(left, l);
  217. // cerr << cur_l << '\n';
  218. // cerr << l << " " << r << " ";
  219. res[num] -= in;
  220. res[num] += kek_left;
  221. res[num] += kek_right[num];
  222.  
  223. for(int p = l; p <= r; p++) {
  224. if(close[p].l >= l) cnt1++;
  225. }
  226. // assert(cnt1 == kek_left);
  227. // cerr << cnt1 << " " << kek_right[num] << '\n';
  228. res[num] = r - l + 1 - res[num];
  229. }
  230. }
  231. for(auto i : res) {
  232. cout << i << " ";
  233. }
  234. return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment