Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define _FORTIFY_SOURCE 0
  3. #pragma GCC optimize("Ofast")
  4. #pragma GCC optimize("no-stack-protector")
  5. #pragma GCC optimize("unroll-loops")
  6. #pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
  7. #pragma GCC optimize("fast-math")
  8. #define left lll
  9. #define right rrr
  10.  
  11. using namespace std;
  12.  
  13. const int MAXN = 3e5 + 2007, INF = 2e9 + 2007;
  14.  
  15. int n, t, k;
  16. vector <int> num, tree_min, used(MAXN), left(MAXN), right(MAXN);
  17. vector <vector <pair <int, int> > > mst(3 * MAXN);
  18. vector <vector <vector <int> > > seg_tree(3 * MAXN);
  19.  
  20.  
  21. void build2(int v, int tl, int tr) {
  22. if (tl + 1 == tr) {
  23. tree_min[v] = num[tl];
  24. return;
  25. }
  26. int tm = (tl + tr) >> 1;
  27. build2(v * 2, tl, tm);
  28. build2(v * 2 + 1, tm, tr);
  29. tree_min[v] = min(tree_min[v * 2], tree_min[v * 2 + 1]);
  30. }
  31.  
  32. int get_min(int v, int tl, int tr, int l, int r) {
  33. if (tl >= r || l >= tr)
  34. return INF;
  35. else if (l <= tl && r >= tr)
  36. return tree_min[v];
  37. else {
  38. int tm = (tl + tr) >> 1;
  39. return min(get_min(v * 2, tl, tm, l, r), get_min(v * 2 + 1, tm, tr, l, r));
  40. }
  41. }
  42.  
  43. void upd(int v, int tl, int tr, int pos, int x) {
  44. if (tl + 1 == tr) {
  45. tree_min[v] = x;
  46. return;
  47. }
  48. int tm = (tl + tr) >> 1;
  49. if (pos < tm)
  50. upd(v * 2, tl, tm, pos, x);
  51. else
  52. upd(v * 2 + 1, tm, tr, pos, x);
  53. tree_min[v] = min(tree_min[v * 2], tree_min[v * 2 + 1]);
  54. }
  55.  
  56. void build3(int pos, int v, int tl, int tr, const vector <int>&kek) {
  57. if (tl + 1 == tr) {
  58. seg_tree[pos][v] = {kek[tl]};
  59. return;
  60. }
  61. int tm = (tl + tr) >> 1;
  62. build3(pos, v * 2, tl, tm, kek);
  63. build3(pos, v * 2 + 1, tm, tr, kek);
  64. merge(seg_tree[pos][v * 2].begin(), seg_tree[pos][v * 2].end(), seg_tree[pos][v * 2 + 1].begin(), seg_tree[pos][v * 2 + 1].end(), back_inserter(seg_tree[pos][v]));
  65. }
  66.  
  67. void build(int v, int tl, int tr) {
  68. if (tl + 1 == tr) {
  69. mst[v] = {{left[tl], right[tl]}};
  70. vector <int> kek = {right[tl]};
  71. seg_tree[v].resize(4);
  72. build3(v, 1, 0, tr - tl, kek);
  73. return;
  74. }
  75. int tm = (tl + tr) >> 1;
  76. build(v * 2, tl, tm);
  77. build(v * 2 + 1, tm, tr);
  78. merge(mst[v * 2].begin(), mst[v * 2].end(), mst[v * 2 + 1].begin(), mst[v * 2 + 1].end(), back_inserter(mst[v]));
  79. vector <int> kek;
  80. for (int i = 0; i < (int)mst[v].size(); i++)
  81. kek.push_back(mst[v][i].second);
  82. seg_tree[v].resize(4 * (tr - tl));
  83. build3(v, 1, 0, tr - tl, kek);
  84. }
  85.  
  86. int get_in_seg_tree(int pos, int v, int tl, int tr, int l, int r, int x) {
  87. if (tl >= r || l >= tr)
  88. return 0;
  89. else if (l <= tl && r >= tr) {
  90. int res = upper_bound(seg_tree[pos][v].begin(), seg_tree[pos][v].end(), x) - seg_tree[pos][v].begin();
  91. return (tr - tl) - res;
  92. }
  93. else {
  94. int tm = (tl + tr) >> 1;
  95. return get_in_seg_tree(pos, v * 2, tl, tm, l, r, x) + get_in_seg_tree(pos, v * 2 + 1, tm, tr, l, r, x);
  96. }
  97. }
  98.  
  99. int get_ans(int v, int tl, int tr, int l, int r, int l1, int r1) {
  100. if (l >= tr || tl >= r)
  101. return 0;
  102. else if (l <= tl && r >= tr) {
  103. int lft = -1, rght = tr - tl;
  104. while (rght - lft > 1) {
  105. int mid = (rght + lft) >> 1;
  106. if (mst[v][mid].first < l1)
  107. lft = mid;
  108. else
  109. rght = mid;
  110. }
  111. int position = lft;
  112. int res = get_in_seg_tree(v, 1, 0, tr - tl, 0, lft + 1, r1);
  113. pair <int, int> need = {r1, -1};
  114. int nxt = upper_bound(mst[v].begin(), mst[v].end(), need) - mst[v].begin();
  115. res += (tr - tl - nxt);
  116. int ll = -1, rr = tr - tl;
  117. while (rr - ll > 1) {
  118. int mm = (rr + ll) >> 1;
  119. if (mst[v][mm].second < l1)
  120. ll = mm;
  121. else
  122. rr = mm;
  123. }
  124. res += ll + 1;
  125. return res;
  126. }
  127. else {
  128. int tm = (tl + tr) >> 1;
  129. return get_ans(v * 2, tl, tm, l, r, l1, r1) + get_ans(v * 2 + 1, tm, tr, l, r, l1, r1);
  130. }
  131. }
  132.  
  133. int main() {
  134. std::ios_base::sync_with_stdio(false);
  135. cin.tie(nullptr);
  136. cout.tie(nullptr);
  137. cin >> n >> t >> k;
  138. num.resize(n);
  139. tree_min.resize(4 * n, INF);
  140. vector <pair <int, int> > all;
  141. for (int i = 0; i < n; i++) {
  142. cin >> num[i];
  143. all.push_back({num[i], i});
  144. }
  145. if (t == 1) {
  146. int l, r;
  147. cin >> l >> r;
  148. l--;
  149. vector <int> smth;
  150. for (int i = l; i < r; i++)
  151. smth.push_back(num[i]);
  152. sort(smth.begin(), smth.end());
  153. int ans = 1;
  154. for (int i = 0; i < (int)smth.size() - 1; i++) {
  155. if (smth[i + 1] - smth[i] > k)
  156. ans++;
  157. }
  158. cout << ans;
  159. return 0;
  160. }
  161. sort(all.begin(), all.end());
  162. build2(1, 0, n);
  163. for (int kek = 0; kek < n; kek++) {
  164. int i = all[kek].second;
  165. int l = i, r = n;
  166. while (r - l > 1) {
  167. int m = (r + l) >> 1;
  168. if (get_min(1, 0, n, i + 1, m + 1) <= num[i] + k)
  169. r = m;
  170. else
  171. l = m;
  172. }
  173. right[i] = r;
  174. l = -1;
  175. r = i;
  176. while (r - l > 1) {
  177. int m = (r + l) >> 1;
  178. if (get_min(1, 0, n, m, i) <= num[i] + k)
  179. l = m;
  180. else
  181. r = m;
  182. }
  183. left[i] = l;
  184. upd(1, 0, n, i, INF);
  185. }
  186. tree_min.clear();
  187. num.clear();
  188. all.clear();
  189. build(1, 0, n);
  190. while (t--) {
  191. int l, r;
  192. cin >> l >> r;
  193. l--;
  194. cout << get_ans(1, 0, n, l, r, l, r - 1) << " ";
  195. }
  196. return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement