Submission #1307448

#TimeUsernameProblemLanguageResultExecution timeMemory
1307448vtnooRailway Trip 2 (JOI22_ho_t4)C++20
25 / 100
572 ms41268 KiB
#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];
vector<int>upr[LOG],upl[LOG];
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[p]=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]);
	}
};
void chmin(int &a,int b){
	if(a>b)a=b;
}
void chmax(int &a,int b){
	if(a<b)a=b;
}
int jump(int a,int k,int r){
	fore(i,0,LOG){
		if((1<<i)&k){
			if(r)a=upr[i][a];
			else a=upl[i][a];
		}
	}
	return a;
}
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);
	vector<vector<int>>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());
	}
	fore(i,0,LOG){
		upr[i].resize(n);
		upl[i].resize(n);
	}
	fore(j,0,n){
		upr[0][j]=R[j]==-INF?j:R[j];
		upl[0][j]=L[j]==INF?j:L[j];
	}
	fore(i,1,LOG){
		segt mn,mx;mn.init(INF,0),mx.init(-INF,1);
		mn.build(upl[i-1]);mx.build(upr[i-1]);
		fore(j,0,n){
			int alcr=upr[i-1][j],alcl=upl[i-1][j];
			upr[i][j]=mx.que(j,upr[i-1][j]);
			
			upl[i][j]=mn.que(upl[i-1][j],j);
			
		}
	}
	int Q;cin>>Q;
	while(Q--){
		 int s,t;cin>>s>>t;s--;t--;
		 int l=-1,r=(1<<(LOG-1));
		 int caso=s<t?1:0;
		 if(caso){
			 while(r-l>1){
				int m=(r+l)/2;
				if(jump(s,m,caso)>=t){
					r=m;
				}else l=m;
			 }
			 if(r==(1<<(LOG-1)))cout<<-1<<endl;
			 else cout<<r<<endl;
		 }
		 else{
			while(r-l>1){
				int m=(r+l)/2;
				if(jump(s,m,caso)<=t){
					r=m;
				}else l=m;
			}
			if(r==(1<<(LOG-1)))cout<<-1<<endl;
			else cout<<r<<endl;
		 }
	}
}
#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...