Submission #1229109

#TimeUsernameProblemLanguageResultExecution timeMemory
1229109_rain_Event Hopping (BOI22_events)C++20
100 / 100
167 ms17484 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=(int)2e5;
const int INF=(int)1e9;
const int MAXLOG=18;
	int par[N+2][MAXLOG+2];
	int s[N+2],e[N+2],l[N+2],r[N+2];
	int n,q,limit_size;
	vector<int>nen;

int Find(int x){
	return upper_bound(nen.begin(),nen.end(),x)-nen.begin();
}

pair<int,int>st[N*4+2];
	void upd(int id,int l,int r,int pos,pair<int,int>val){
		if (l>pos||r<pos) return;
		if (l==r) st[id]=min(st[id],val);
		else {
			int m=(l+r)/2;
			upd(id*2,l,m,pos,val);
			upd(id*2+1,m+1,r,pos,val);
			st[id]=min(st[id*2],st[id*2+1]);
		}
	}
	pair<int,int>Get(int id,int l,int r,int u,int v){
		if (l>v||r<u) return {INF,INF};
		if (u<=l&&r<=v) return st[id];
		int m=(l+r)/2;
		return min(Get(id*2,l,m,u,v),Get(id*2+1,m+1,r,u,v));
	}

void process(int l,int r){
	int ans=2;
	for(int j=MAXLOG;j>=0;--j){
		if (s[par[r][j]]>e[l]){
			ans+=(1<<j);
			r=par[r][j];
		}
	}
	r=par[r][0];
	if (s[r]<=e[l] && e[l]<=e[r]){
		cout<<ans<<'\n';
		return;
	}
	cout<<"impossible\n";
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	#define task "main"
	if (fopen(task".inp","r")){
		freopen(task".inp","r",stdin);
		freopen(task".out","w",stdout);
	}
	
	cin>>n>>q;
	for(int i=1;i<=N*4;++i) st[i]={INF,INF};
	for(int i=1;i<=n;++i) cin>>s[i]>>e[i];
	for(int i=1;i<=n;++i) {
		nen.push_back(s[i]);
		nen.push_back(e[i]);
	}
	sort(nen.begin(),nen.end());
	nen.resize(unique(nen.begin(),nen.end())-nen.begin());
	limit_size=nen.size();
	for(int i=1;i<=n;++i){
		s[i]=Find(s[i]) , e[i]=Find(e[i]);
		upd(1,1,limit_size,e[i],{s[i],i});
	}
	for(int i=1;i<=n;++i) {
		par[i][0]=Get(1,1,limit_size,s[i],e[i]).second;
	}

	for(int j=1;j<=MAXLOG;++j){
		for(int i=1;i<=n;++i) par[i][j]=par[par[i][j-1]][j-1];
	}

	while(q--){
		int l,r; cin>>l>>r;
		if (e[l]>e[r]) {
			cout<<"impossible\n";
			continue;
		}
		if (l==r){
			cout<<0<<'\n';
			continue;
		}
		if (s[r]<=e[l] && e[l]<=e[r]){
			cout<<1<<'\n';
			continue;
		}
		process(l,r);
	}
	return 0;
}

Compilation message (stderr)

events.cpp: In function 'int main()':
events.cpp:56:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |                 freopen(task".inp","r",stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
events.cpp:57:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |                 freopen(task".out","w",stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...