제출 #706804

#제출 시각아이디문제언어결과실행 시간메모리
706804xuliuRailway Trip 2 (JOI22_ho_t4)C++17
71 / 100
720 ms70936 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long 
#define debug if(0)

typedef pair<int, int> pii;
const pii ID = {0, 0};

pii comb(pii a, pii b) {
	if(a == ID) return b;
	if(b == ID) return a;
	int lx = min(a.first, b.first), rx = max(a.second, b.second);
	return {lx, rx};
}

struct segtree {
	int sz;
	vector<pii> seg;
	void init(int n, vector<pii> &v) {
		sz = 1;
		while(sz < n) sz <<= 1;
		seg.assign(2*sz+2, ID);
		for(int i=0; i<n; i++) seg[i+1+sz] = v[i];
		for(int i=sz-1; i>=1; i--) seg[i] = comb(seg[i<<1], seg[(i<<1)+1]);
	}
	pii query(int a, int b, int x, int l, int r) {
		if(b < l || a > r) return ID;
		if(a <= l && b >= r) return seg[x];
		int m = (l+r)>>1;
		return comb(query(a, b, x<<1, l, m), query(a, b, (x<<1)+1, m+1, r));
	}
	pii query(int a, int b) { return query(a, b, 1, 0, sz-1); }
};

const int N = 1e5 + 4, M = 19;
pii range[M][N];
vector<int> ev[N];
segtree st[M];

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n, k; cin>>n>>k;
	int m; cin>>m;
	vector<pii> lines;
	for(int i=0; i<m; i++) {
		int a, b; cin>>a>>b;
		lines.push_back({a, b});
		if(a < b) {
			ev[a].push_back(b);
			ev[min(b+1, a+k)].push_back(-b);
		}
		else {
			ev[max(b, a-k+1)].push_back(b);
			ev[a+1].push_back(-b);
		}
	}
	for(int i=0; i<=n; i++) range[0][i] = {i, i};
	multiset<int> S;
	for(int i=1; i<=n; i++) {
		for(auto e : ev[i]) {
			if(e > 0) S.insert(e);
			else {
				auto it = S.find(-e);
				if(it != S.end()) S.erase(it);
			}
		}
		if(!S.empty()) {
			auto it = S.end(); --it;
			range[0][i] = {min(i, *S.begin()), max(i, *it)};
		}
	}
	debug {
		for(int i=1; i<=n; i++) {
			cerr<<"range[0]["<<i<<"] = {"<<range[0][i].first<<", "<<range[0][i].second<<"}\n";
		}
	}
	{
		vector<pii> vv;
		for(int i=1; i<=n; i++) vv.push_back(range[0][i]);
		st[0].init(n, vv);
	}
	for(int j=1; j<M; j++) {
		vector<pii> vv;
		for(int i=1; i<=n; i++) {
			int l = range[j-1][i].first, r = range[j-1][i].second;
			range[j][i] = st[j-1].query(l, r);
			vv.push_back(range[j][i]);
		}
		st[j].init(n, vv);
	}
	
	int q; cin>>q;
	while(q--) {
		int s, t; cin>>s>>t;
		if(t < range[M-1][s].first || t > range[M-1][s].second) {
			cout<<"-1\n";
			continue;
		}
		int ans = 0;
		pii r = {s, s};
		for(int j=M-1; j>=0; j--) {
			pii tt = st[j].query(r.first, r.second);
			if(t < tt.first || t > tt.second) {
				r = tt;
				ans += (1<<j);
			}
		}
		cout<<ans+1<<"\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...