#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define snd second
#define fore(i,a,b) for(int i=a,pao=b;i<pao;++i)
#define SZ(x) ((int)x.size())
#define ALL(x) x.begin(),x.end()
#define me(a,v) memset((a),(v),sizeof(a))
#define FIN ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int MAXM=2e5+5,MAXN=1e5+5,LOG=19,INF=1e9;
int A[MAXM],B[MAXM],L[MAXN],R[MAXN];
int n;
struct segt{
int st[MAXN*4],NEUT,OPER;
void init(int a,int b){
NEUT=a,OPER=b;
fill(st,st+MAXN*4,NEUT);
}
int op(int a,int b){
if(OPER)return max(a,b);
else return min(a,b);
}
void upd(int p,int x,int v=1,int s=0,int e=n-1){
if(s==e){st[v]=x;return;}
int m=(s+e)/2;
if(p<=m)upd(p,x,v*2,s,m);
else upd(p,x,v*2+1,m+1,e);
st[v]=op(st[v*2],st[v*2+1]);
}
int que(int ts,int te,int v=1,int s=0,int e=n-1){
if(e<ts||te<s)return NEUT;
if(ts<=s&&e<=te){
return st[v];
}
int m=(s+e)/2;
return op(que(ts,te,v*2,s,m),que(ts,te,v*2+1,m+1,e));
}
void build(vector<int>&a,int v=1,int s=0,int e=n-1){
if(s==e){st[v]=a[s];return;}
int m=(s+e)/2;
build(a,v*2,s,m);
build(a,v*2+1,m+1,e);
st[v]=op(st[v*2],st[v*2+1]);
}
};
segt mn[LOG],mx[LOG];
void chmin(int &a,int b){
if(a>b)a=b;
}
void chmax(int &a,int b){
if(a<b)a=b;
}
int main(){FIN;
int k;cin>>n>>k;
int m;cin>>m;
fill(L,L+n,INF);
fill(R,R+n,-INF);
vector<vector<int>>add(n),rem(n),add2(n),rem2(n);
fore(i,0,m){
cin>>A[i]>>B[i];
A[i]--;B[i]--;
if(A[i]<B[i]){
add[A[i]].pb(B[i]);
if(min(A[i]+k,B[i]+1)<n)rem[min(A[i]+k,B[i]+1)].pb(B[i]);
}else{
add2[A[i]].pb(B[i]);
if(max(A[i]-k,B[i]-1)>=0)rem2[max(A[i]-k,B[i]-1)].pb(B[i]);
}
}
multiset<int>s;
fore(i,0,n){
if(!s.empty())for(auto x:rem[i])s.erase(s.find(x));
for(auto x:add[i])s.insert(x);
if(!s.empty())chmax(R[i],*s.rbegin());
}
s.clear();
for(int i=n-1;i>=0;i--){
if(!s.empty())for(auto x:rem2[i])s.erase(s.find(x));
for(auto x:add2[i])s.insert(x);
if(!s.empty())chmin(L[i],*s.begin());
}
mn[0].init(INF,0),mx[0].init(-INF,1);
fore(j,0,n){
mx[0].upd(j,R[j]==-INF?j:R[j]);
mn[0].upd(j,L[j]==INF?j:L[j]);
}
fore(i,1,LOG){
mn[i].init(INF,0),mx[i].init(-INF,1);
vector<int>v1,v2;
fore(j,0,n){
v1.pb(mn[i-1].que(j,j));
v2.pb(mx[i-1].que(j,j));
}
fore(j,0,n){
int l=v1[j],r=v2[j];
mn[i].upd(j,mn[i-1].que(l,r));
mx[i].upd(j,mx[i-1].que(l,r));
}
}
int Q;cin>>Q;
while(Q--){
int s,t;cin>>s>>t;s--;t--;
int l=s,r=s,ans=0;
for(int i=LOG-1;i>=0;i--){
int nxtl=mn[i].que(l,r),nxtr=mx[i].que(l,r);
if(nxtl>t||nxtr<t){
l=nxtl;r=nxtr;
ans+=(1<<i);
}
}
int nxtl=mn[0].que(l,r),nxtr=mx[0].que(l,r);
//~ cout<<nxtl<<" "<<nxtr<<endl;
if(nxtl<=t&&t<=nxtr){
cout<<ans+1<<endl;
}else cout<<-1<<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... |