Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <map>
- #include <set>
- #include <bitset>
- #include <queue>
- #include <stack>
- #include <sstream>
- #include <cstring>
- #include <numeric>
- #include <ctime>
- #include <iomanip>
- #define make_unique(x) sort(all(x)),x.resize(unique(all(x))-x.begin())
- #define re return
- #define fi first
- #define se second
- #define mp make_pair
- #define pb push_back
- #define ss second.second
- #define sf second.first
- #define ff first.first
- #define fs first.second
- #define all(x) (x).begin(), (x).end()
- #define sz(x) ((int) (x).size())
- #define rep(i, n) for (int i = 0; i < (n); i++)
- #define rrep(i, n) for (int i = (n) - 1; i >= 0; i--)
- #define sqr(x) ((x) * (x))
- #define sqrt(x) sqrt(abs(x))
- #define tr(x, y) ((x)*(x) + (y)*(y))
- using namespace std;
- typedef long long ll;
- typedef pair <int, int> pii;
- typedef pair <ll, ll> pll;
- typedef vector <int> vi;
- typedef long double ld;
- class node
- {
- public:
- node *l,*r;
- int sum;
- node()
- {
- l = r = nullptr;
- sum = 0;
- }
- node(node* t)
- {
- if (t != nullptr)
- {
- l = t->l;
- r = t->r;
- sum = t->sum;
- }
- else
- {
- l = r = nullptr;
- sum = 0;
- }
- }
- };
- int n, s, d;
- pii a[100100];
- int p[100100];
- int t[400100];
- int ans[100100];
- map<int, int> ma;
- int m;
- node* v[100100];
- vector<pii> seg;
- void add2(int v, int l, int r, int pos, int x)
- {
- if (r - l == 1)
- {
- t[v] += x;
- re;
- }
- int c = (l + r) / 2;
- if (pos < c)
- add2(2*v, l, c, pos, x);
- else
- add2(2*v+1, c, r, pos, x);
- t[v] = max(t[2*v], t[2*v+1]);
- }
- int max2(int v, int l, int r, int L, int R)
- {
- if (R <= L) re 0;
- if (l == L && r == R) re t[v];
- int c = (l + r) / 2;
- re max(max2(2*v, l, c, L, min(c, R)), max2(2*v+1, c, r, max(L, c), R));
- }
- int get(node* t)
- {
- if (t == nullptr)
- re 0;
- else
- re t->sum;
- }
- node* add(node* t, int l, int r, int p, int x)
- {
- //cout << l << " " << r << endl;
- node* nt = new node(t);
- if (r - l == 1)
- {
- //cout << "!!!!!!!!!" << endl;
- nt->sum += x;
- re nt;
- }
- int c = (l + r) / 2;
- if (p < c)
- nt->l = add(t == nullptr ? nullptr : t->l, l, c, p, x);
- else
- nt->r = add(t == nullptr ? nullptr : t->r, c, r, p, x);
- nt->sum = get(nt->l) + get(nt->r);
- re nt;
- }
- int sum(node* t, int l, int r, int L, int R)
- {
- if (L >= R) re 0;
- if (l == L && r == R)
- re get(t);
- int c = (r + l) / 2;
- int ans = 0;
- if (t->l && c > L) ans += sum(t->l, l, c, L, min(c, R));
- if (t->r && c < R) ans += sum(t->r, c, r, max(L, c), R);
- re ans;
- }
- int main(){
- #ifdef EKLER
- //freopen("input.txt", "r", stdin);
- //freopen("input.txt", "w", stdout);
- #else
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- #endif
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cin >> n >> s >> d;
- rep(i, n)
- cin >> a[i].fi >> a[i].se;
- sort (a, a + n);
- rep(i, n) ma[a[i].se] = -1;
- v[0] = new node();
- rep(i, n)
- {
- p[i] = ma[a[i].se];
- //cout << p[i] << " ";
- ma[a[i].se] = i;
- if (p[i] == -1)
- v[i+1] = v[i];
- else
- v[i+1] = add(v[i], 0, n, p[i], 1);
- }
- //cout << endl;
- int l = 0;
- int r = 1;
- int sh = 1;
- while (sh < n) sh *= 2;
- for (;r < n;)
- {
- if (a[r].fi - a[r-1].fi <= d) r++;
- else
- {
- seg.pb(mp(l, r));
- ans[sz(seg) - 1] = (r - l) - sum(v[r], 0, n, l, r);
- add2(1, 0, sh, sz(seg) - 1, ans[sz(seg) - 1]);
- //cout << " otr " << l << " " << r << " " << sz(seg) - 1 << " " << ans[sz(seg) - 1] << endl;
- l = r;
- r++;
- }
- }
- seg.pb(mp(l, r));
- ans[sz(seg) - 1] = (r - l) - sum(v[r], 0, n, l, r);
- add2(1, 0, sh, sz(seg) - 1, ans[sz(seg) - 1]);
- //cout << " otr " << l << " " << r << " " << sz(seg) - 1 << " " << ans[sz(seg) - 1] << endl;
- cin >> m;
- rep(i, m)
- {
- cin >> l >> r;
- r++;
- l = lower_bound(a, a + n, mp(l, -1)) - a;
- r = lower_bound(a, a + n, mp(r, -1)) - a;
- //cout << " " << l << " " << r << endl;
- int ll = lower_bound(all(seg), mp(l, l)) - seg.begin();
- int rr = lower_bound(all(seg), mp(r, r)) - seg.begin();
- //cout << " : " << ll << " " << rr << endl;
- if (ll == rr)
- {
- cout << (r - l) - sum(v[r], 0, n, l, r) << "\n";
- continue;
- }
- int best = max2(1, 0, sh, ll, rr);
- rr--;
- //cout << best << "\n";
- if (seg[ll].fi > l) best = max(best, seg[ll].fi - l - sum(v[seg[ll].fi], 0, n, l, seg[ll].fi));
- if (seg[rr].fi < r) best = max(best, r - seg[rr].fi - sum(v[r], 0, n, seg[rr].fi, r));
- cout << best << "\n";
- }
- re 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement