#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
using namespace std;
int n,k,m;
int lefs[100023],rigs[100023];
vector<int>leftmost[100023],rightmost[100023];
pair<int,int>tree[400023][18];
void it(){
	multiset<int>stl,str;
	for(int i=1;i<=n;i++){
		for(int x:rightmost[i]){
			if(x<0)str.erase(str.find(x));
			else str.insert(-x);
		}
		for(int x:leftmost[i]){
			if(x<0)stl.erase(stl.find(-x));
			else stl.insert(x);
		}
		if(str.size()){
			rigs[i]=max(rigs[i],-*str.begin());
		}
		if(stl.size()){
			lefs[i]=min(lefs[i],*stl.begin());
		}
	}
}
void build(int lg,int node=1,int left=1,int right=-1){
	if(right==-1)right=n;
	if(left==right){
		tree[node][lg].fr=lefs[left];
		tree[node][lg].sc=rigs[left];
		return;
	}
	const int mid=(left+right)>>1;
	build(lg,node*2,left,mid);
	build(lg,node*2+1,mid+1,right);
	tree[node][lg]={min(tree[node*2][lg].fr,tree[node*2+1][lg].fr),max(tree[node*2][lg].sc,tree[node*2+1][lg].sc)};
}
pair<int,int> query(int lg,int l,int r,int node=1,int left=1,int right=-1){
	if(right==-1)right=n;
	if(left>r||right<l)return {n+1,-n-1};
	if(left>=l&&right<=r)return tree[node][lg];
	const int mid=(left+right)>>1;
	pair<int,int>res1=query(lg,l,r,node*2,left,mid),res2=query(lg,l,r,node*2+1,mid+1,right);
	return {min(res1.fr,res2.fr),max(res1.sc,res2.sc)};
}
int main(){
	ios_base::sync_with_stdio(false);cin.tie(NULL);
	cin>>n>>k>>m;
	for(int i=1;i<=n;i++){
		lefs[i]=i;
		rigs[i]=i;
	}
	for(int i=1;i<=m;i++){
		int a,b;cin>>a>>b;
		if(a<b){
			rightmost[a].pb(b);
			rightmost[min(a+k-1,b)+1].pb(-b);
		}
		else{
			leftmost[max(a-k+1,b)].pb(b);
			leftmost[a+1].pb(-b);
		}
	}
	it();
	build(0);
	for(int i=1;i<18;i++){
		for(int j=1;j<=n;j++){
			//cout<<lefs[j]<<":"<<rigs[j]<<" ";
			pair<int,int>p=query(i-1,lefs[j],rigs[j]);
			lefs[j]=p.fr;
			rigs[j]=p.sc;
		}
		//cout<<endl;
		build(i);
	}
	int q;cin>>q;
	while(q--){
		int s,t;cin>>s>>t;
		int l=s,r=s;
		int ans=1;
		for(int i=18-1;i>=0;i--){
			pair<int,int>p=query(i,l,r);
			if(t>=p.fr&&t<=p.sc)continue;
			ans+=(1<<i);
			l=p.fr;
			r=p.sc;
		}
		if(ans>m){
			cout<<-1;
		}
		else cout<<ans;
		cout<<endl;
	}
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |