Submission #928282

#TimeUsernameProblemLanguageResultExecution timeMemory
928282pccRailway Trip 2 (JOI22_ho_t4)C++17
27 / 100
2068 ms22596 KiB
#include <bits/stdc++.h>
using namespace std;


#define pii pair<int,int>
#define fs first
#define sc second
const int mxn = 1e5+10;

int N,M,K,Q;
pii range[mxn],segtree[mxn*4];
vector<int> lop[mxn],rop[mxn];

void build(int now,int l,int r){
	if(l == r){
		segtree[now] = range[l];
		return;
	}
	int mid = (l+r)>>1;
	build(now*2+1,l,mid);
	build(now*2+2,mid+1,r);
	segtree[now].fs = min(segtree[now*2+1].fs,segtree[now*2+2].fs);
	segtree[now].sc = max(segtree[now*2+1].sc,segtree[now*2+2].sc);
}
pii getval(int now,int l,int r,int s,int e){
	if(l>=s&&e>=r)return segtree[now];
	int mid = (l+r)>>1;
	if(mid>=e)return getval(now*2+1,l,mid,s,e);
	else if(mid<s)return getval(now*2+2,mid+1,r,s,e);
	else{
		auto ta = getval(now*2+1,l,mid,s,e),tb = getval(now*2+2,mid+1,r,s,e);
		return make_pair(min(ta.fs,tb.fs),max(ta.sc,tb.sc));
	}
}

void solve(){
	int s,e;
	cin>>s>>e;
	pii now = {s,s};
	int ans = 0;
	while(now.fs>e||now.sc<e){
		ans++;
		auto nxt = getval(0,1,N,now.fs,now.sc);
		if(nxt.fs == now.fs&&nxt.sc == now.sc)break;
		now = nxt;
	}
	cout<<(now.fs>e||now.sc<e?-1:ans)<<'\n';
	return;
}

int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>N>>K>>M;
	for(int i = 0;i<M;i++){
		int a,b;
		cin>>a>>b;
		if(a<=b){
			int e = min(b+1,a+K);
			rop[a].push_back(b);
			rop[e].push_back(-b);
		}
		else{
			int e = max(b-1,a-K);
			lop[a].push_back(b);
			lop[e].push_back(-b);
		}
	}
	for(int i = 1;i<=N;i++)range[i].fs = range[i].sc = i;
	multiset<int> st;
	for(int i = 1;i<=N;i++){
		for(auto &j:rop[i]){
			if(j>0)st.insert(j);
			else st.erase(st.find(-j));
		}
		if(!st.empty())range[i].sc = *st.rbegin();
	}

	st.clear();
	for(int i = N;i>=1;i--){
		for(auto &j:lop[i]){
			if(j>0)st.insert(j);
			else st.erase(st.find(-j));
		}
		if(!st.empty())range[i].fs = *st.begin();
	}
	build(0,1,N);
	cin>>Q;
	while(Q--)solve();
}
#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...