Submission #1264131

#TimeUsernameProblemLanguageResultExecution timeMemory
1264131goulthenRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
252 ms77668 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i,a,b) for (int i = a; i <= b; ++i)
#define per(i,a,b) for (int i = a; i >= b; --i)
#define pii pair<int,int>
#define fi first
#define se second
#define all(v) (v).begin(), (v).end()
#define pb push_back

const int MAXN = 1e5 + 10;

struct Range {
	int l, r;
	Range(int x, int y) {
		l = x;
		r = y;
	}
	Range(int x) { l = r = x; }
	Range() {
		l = INT_MAX;
		r = INT_MIN;
	}
	Range operator|(Range a) { return Range(min(l, a.l), max(r, a.r)); }
	void operator|=(Range a) {
		l = min(l, a.l);
		r = max(r, a.r);
	}
};

struct Seg3{
	vector<Range> v;
	int c;
	void update(int x, Range y) {
		x += 1 << c;
		while (x) {
			v[x] |= y;
			x /= 2;
		}
	}
	Range calc(int x) { return v[x+(1<<c)]; }
	Range calc(int l, int r) {
		l += 1 << c;
		r += 1 << c;
		Range x;
		while (l<=r) {
			x |= v[l];
			x |= v[r];
			l = (l + 1)/2;
			r = (r - 1)/2;
		}
		return x;
	}
	Range calc(Range x) { return calc(x.l, x.r); }

	Seg3() {}
	Seg3(int n) {
		c = 0;
		while ((1 << c) < n) c++;
		v.resize(1 << c + 1);
	}
};
int n,m,k,q;
Range R[MAXN];
Seg3 seg[18];



int query(int s, int t) {
    int cnt = 0;
    Range p = Range(s);
    per(i, 17, 0) {
        Range q = seg[i].calc(p);
        if (!(q.l <= t && t <= q.r)) {
            p = q;
            cnt += 1 << i;
        }
    }
    if (cnt == (1 << 18) - 1) return -1;
    else return cnt + 1;
}

int32_t main() {
	ios_base::sync_with_stdio(0); cin.tie(nullptr);

	cin >> n >> k >> m;

	rep(i,0,17) seg[i] = Seg3(n);
	rep(i,0,n-1) R[i] = Range(i);
	rep(i,1,m) {
		int a,b;cin >> a >> b;
		R[a-1] |= Range(b-1);
	}

	deque<pii> dq;

	rep(i,0,n-1) {
		while (!dq.empty() && dq.back().fi < R[i].r) dq.pop_back();
		dq.push_back({R[i].r,i+k-1});
		seg[0].update(i, Range(dq.front().fi));
		while (!dq.empty() && dq.front().se <= i) dq.pop_front();
	}
	dq.clear();
	per(i,n-1,0) {
		while(!dq.empty() && dq.back().fi > R[i].l) dq.pop_back();
		dq.push_back({R[i].l,i-k+1});
		seg[0].update(i, Range(dq.front().fi));
		while (!dq.empty() && dq.front().se >= i) dq.pop_front();
	}

	rep(i,1,17) {
		rep(j,0,n-1) {
			seg[i].update(j, seg[i-1].calc(seg[i-1].calc(j)));
		}
	}
	cin >> q;
	while (q--) {
		int u,v;cin >> u >> v;
		u--;v--;
		cout << query(u,v) << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...