Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.12 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <map>
  9. #include <set>
  10. #include <bitset>
  11. #include <queue>
  12. #include <stack>
  13. #include <sstream>
  14. #include <cstring>
  15. #include <numeric>
  16. #include <ctime>
  17. #include <iomanip>
  18.  
  19. #define make_unique(x) sort(all(x)),x.resize(unique(all(x))-x.begin())
  20. #define re return
  21. #define fi first
  22. #define se second
  23. #define mp make_pair
  24. #define pb push_back
  25. #define ss second.second
  26. #define sf second.first
  27. #define ff first.first
  28. #define fs first.second
  29. #define all(x) (x).begin(), (x).end()
  30. #define sz(x) ((int) (x).size())
  31. #define rep(i, n) for (int i = 0; i < (n); i++)
  32. #define rrep(i, n) for (int i = (n) - 1; i >= 0; i--)
  33. #define sqr(x) ((x) * (x))
  34. #define sqrt(x) sqrt(abs(x))
  35. #define tr(x, y) ((x)*(x) + (y)*(y))
  36.  
  37. using namespace std;
  38.  
  39. typedef long long ll;
  40. typedef pair <int, int> pii;
  41. typedef pair <ll, ll> pll;
  42. typedef vector <int> vi;
  43. typedef long double ld;
  44.  
  45. class node
  46. {
  47. public:
  48. node *l,*r;
  49. int sum;
  50. node()
  51. {
  52. l = r = nullptr;
  53. sum = 0;
  54. }
  55. node(node* t)
  56. {
  57. if (t != nullptr)
  58. {
  59. l = t->l;
  60. r = t->r;
  61. sum = t->sum;
  62. }
  63. else
  64. {
  65. l = r = nullptr;
  66. sum = 0;
  67. }
  68. }
  69. };
  70.  
  71. int n, s, d;
  72. pii a[100100];
  73. int p[100100];
  74. int t[400100];
  75. int ans[100100];
  76. map<int, int> ma;
  77. int m;
  78. node* v[100100];
  79. vector<pii> seg;
  80.  
  81. void add2(int v, int l, int r, int pos, int x)
  82. {
  83. if (r - l == 1)
  84. {
  85. t[v] += x;
  86. re;
  87. }
  88. int c = (l + r) / 2;
  89. if (pos < c)
  90. add2(2*v, l, c, pos, x);
  91. else
  92. add2(2*v+1, c, r, pos, x);
  93. t[v] = max(t[2*v], t[2*v+1]);
  94. }
  95.  
  96. int max2(int v, int l, int r, int L, int R)
  97. {
  98. if (R <= L) re 0;
  99. if (l == L && r == R) re t[v];
  100. int c = (l + r) / 2;
  101. re max(max2(2*v, l, c, L, min(c, R)), max2(2*v+1, c, r, max(L, c), R));
  102. }
  103.  
  104. int get(node* t)
  105. {
  106. if (t == nullptr)
  107. re 0;
  108. else
  109. re t->sum;
  110. }
  111.  
  112. node* add(node* t, int l, int r, int p, int x)
  113. {
  114. //cout << l << " " << r << endl;
  115. node* nt = new node(t);
  116. if (r - l == 1)
  117. {
  118. //cout << "!!!!!!!!!" << endl;
  119. nt->sum += x;
  120. re nt;
  121. }
  122. int c = (l + r) / 2;
  123. if (p < c)
  124. nt->l = add(t == nullptr ? nullptr : t->l, l, c, p, x);
  125. else
  126. nt->r = add(t == nullptr ? nullptr : t->r, c, r, p, x);
  127. nt->sum = get(nt->l) + get(nt->r);
  128. re nt;
  129. }
  130.  
  131. int sum(node* t, int l, int r, int L, int R)
  132. {
  133. if (L >= R) re 0;
  134. if (l == L && r == R)
  135. re get(t);
  136. int c = (r + l) / 2;
  137. int ans = 0;
  138. if (t->l && c > L) ans += sum(t->l, l, c, L, min(c, R));
  139. if (t->r && c < R) ans += sum(t->r, c, r, max(L, c), R);
  140. re ans;
  141. }
  142.  
  143. int main(){
  144. #ifdef EKLER
  145. //freopen("input.txt", "r", stdin);
  146. //freopen("input.txt", "w", stdout);
  147. #else
  148. //freopen("input.txt", "r", stdin);
  149. //freopen("output.txt", "w", stdout);
  150. #endif
  151.  
  152. ios::sync_with_stdio(0);
  153. cin.tie(0);
  154. cout.tie(0);
  155.  
  156. cin >> n >> s >> d;
  157. rep(i, n)
  158. cin >> a[i].fi >> a[i].se;
  159. sort (a, a + n);
  160. rep(i, n) ma[a[i].se] = -1;
  161. v[0] = new node();
  162. rep(i, n)
  163. {
  164. p[i] = ma[a[i].se];
  165. //cout << p[i] << " ";
  166. ma[a[i].se] = i;
  167. if (p[i] == -1)
  168. v[i+1] = v[i];
  169. else
  170. v[i+1] = add(v[i], 0, n, p[i], 1);
  171. }
  172. //cout << endl;
  173. int l = 0;
  174. int r = 1;
  175. int sh = 1;
  176. while (sh < n) sh *= 2;
  177. for (;r < n;)
  178. {
  179. if (a[r].fi - a[r-1].fi <= d) r++;
  180. else
  181. {
  182. seg.pb(mp(l, r));
  183. ans[sz(seg) - 1] = (r - l) - sum(v[r], 0, n, l, r);
  184. add2(1, 0, sh, sz(seg) - 1, ans[sz(seg) - 1]);
  185. //cout << " otr " << l << " " << r << " " << sz(seg) - 1 << " " << ans[sz(seg) - 1] << endl;
  186. l = r;
  187. r++;
  188. }
  189. }
  190. seg.pb(mp(l, r));
  191. ans[sz(seg) - 1] = (r - l) - sum(v[r], 0, n, l, r);
  192. add2(1, 0, sh, sz(seg) - 1, ans[sz(seg) - 1]);
  193. //cout << " otr " << l << " " << r << " " << sz(seg) - 1 << " " << ans[sz(seg) - 1] << endl;
  194. cin >> m;
  195. rep(i, m)
  196. {
  197. cin >> l >> r;
  198. r++;
  199. l = lower_bound(a, a + n, mp(l, -1)) - a;
  200. r = lower_bound(a, a + n, mp(r, -1)) - a;
  201. //cout << " " << l << " " << r << endl;
  202. int ll = lower_bound(all(seg), mp(l, l)) - seg.begin();
  203. int rr = lower_bound(all(seg), mp(r, r)) - seg.begin();
  204. //cout << " : " << ll << " " << rr << endl;
  205. if (ll == rr)
  206. {
  207. cout << (r - l) - sum(v[r], 0, n, l, r) << "\n";
  208. continue;
  209. }
  210. int best = max2(1, 0, sh, ll, rr);
  211. rr--;
  212. //cout << best << "\n";
  213. if (seg[ll].fi > l) best = max(best, seg[ll].fi - l - sum(v[seg[ll].fi], 0, n, l, seg[ll].fi));
  214. if (seg[rr].fi < r) best = max(best, r - seg[rr].fi - sum(v[r], 0, n, seg[rr].fi, r));
  215. cout << best << "\n";
  216. }
  217. re 0;
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement