Submission #1146786

#TimeUsernameProblemLanguageResultExecution timeMemory
1146786Rawlat_vanakEvent Hopping (BOI22_events)C++20
0 / 100
23 ms10568 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//#define mod 1000000007
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back

vector<pii> seg,idk;

void build(int v, int l, int r){
	if(l>r) return;
	if(l==r){
		seg[v]=idk[l];
	}else{
		int m=(l+r)/2;
		build(2*v,l,m);
		build(2*v+1,m+1,r);
		seg[v]=max(seg[2*v],seg[2*v+1]);
	}
}



pii get(int v, int l, int r, int cl, int cr){
	if(cl>cr){
		return {0,0};
	}
	if(l==cl and r==cr){
		return seg[v];
	}else{
		int m=(l+r)/2;
		return max(get(2*v,l,m,cl,min(cr,m)),get(2*v+1,m+1,r,max(m+1,cl),cr));
	}
}


int32_t main(){
	speedIO;
	int t,n,m,k,q;
	//cin>>t;
	t=1;
	while(t--){
		cin>>n>>q;
		int s[n],e[n];
		vector<pii> start(n);
		for(int i=0;i<n;i++){
			cin>>s[i]>>e[i];
			start[i]={s[i],i};
		}
		sort(start.begin(),start.end());
		vector<int> best(n),bruh(n),pos(n);
		idk.resize(n+1);
		for(int i=0;i<n;i++){
			idk[i+1].f=e[start[i].s];
			idk[i+1].s=start[i].s;
			pos[start[i].s]=i;
			bruh[i]=start[i].f;
			//cout<<idk[i+1].f<<' '<<idk[i+1].s<<'\n';
		}
		//cout<<'\n';
		seg.resize(2*n+1);
		build(1,1,n);
		//cout<<get(1,1,n,1,3).f<<' '<<get(1,1,n,1,3).s<<'\n';

		for(int i=0;i<n;i++){
			int l=s[i],r=e[i];
			int idx=upper_bound(bruh.begin(),bruh.end(),r)-bruh.begin();
			idx--;
			//cout<<idx<<'\n';
			if(idx==-1){
				best[i]=-1;
			}else{
				//pii tmp=max(get(1,1,n,1,pos[i]),get(1,1,n,pos[i]+2,idx+1));
				pii tmp=get(1,1,n,1,idx+1);
				if(tmp.f>=e[i]){
					best[i]=tmp.s;
				}else{
					best[i]=-1;
				}
				if(best[i]==i){
					best[i]=-1;
				}

			}

		}
		/*for(int i:best){
			cout<<i<<' ';
		}
		cout<<'\n';*/

			

		while(q--){
			int x,y;
			cin>>x>>y;
			x--;y--;
			if(x==y){
				cout<<0<<'\n';
				continue;
			}
			int cl=s[x],cr=e[x];
			int el=s[y],er=e[y];

			int ans=0;
			bool flag=true;
			if(er<cr) flag=false;
			while(el>cr){
				if(er<cr) flag=false;
				if(best[x]==-1){
					flag=false;
					break;
				}
				x=best[x];
				cl=s[x];
				cr=e[x];
				ans++;
			}
			if(er<cr) flag=false;
			if(flag){
				cout<<ans+1<<'\n';
			}else{
				cout<<"impossible\n";
			}

		}
		
		




		



		
		



		



	
	
	


		

		

	}
	return 0;
}
#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...