Submission #574313

#TimeUsernameProblemLanguageResultExecution timeMemory
574313JasiekstrzEvent Hopping (BOI22_events)C++17
100 / 100
395 ms23260 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=1e5;
const int P=1<<18;
const int L=18;
const int INF=1e9+7;
pair<int,int> t[N+10];
map<int,int> sc;
int pot;
pair<int,int> tr[2*P+10];
int jmp[N+10][L+1];
bool vis_jmp[N+10];
void add(int x,pair<int,int> c)
{
	for(x+=pot-1;x>=1;x/=2)
		tr[x]=min(tr[x],c);
	return;
}
int read(int l,int r)
{
	pair<int,int> ans={INF,0};
	for(l+=pot-1,r+=pot-1;l<=r;l/=2,r/=2)
	{
		if(l%2==1)
			ans=min(ans,tr[l++]);
		if(r%2==0)
			ans=min(ans,tr[r--]);
	}
	return ans.se;
}
void calc_jmp(int x)
{
	if(t[jmp[x][0]].fi>=t[x].fi)
		jmp[x][0]=0;
	vis_jmp[x]=true;
	if(!vis_jmp[jmp[x][0]])
		calc_jmp(jmp[x][0]);
	for(int i=1;i<=L;i++)
		jmp[x][i]=jmp[jmp[x][i-1]][i-1];
	return;
}
pair<int,int> far(int x,int y)
{
	int c=0;
	for(int i=L;i>=0;i--)
	{
		if(t[jmp[x][i]].fi>y)
		{
			c+=(1<<i);
			x=jmp[x][i];
		}
	}
	return {x,c};
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>t[i].fi>>t[i].se;
		sc[t[i].fi]=sc[t[i].se]=0;
	}
	int k=0;
	for(auto [a,b]:sc)
		sc[a]=++k;
	for(pot=1;pot<k;pot*=2);
	for(int i=1;i<=2*pot;i++)
		tr[i]={INF,0};
	for(int i=1;i<=n;i++)
		add(sc[t[i].se],{t[i].fi,i});
	for(int i=1;i<=n;i++)
		jmp[i][0]=read(sc[t[i].fi],sc[t[i].se]);
	vis_jmp[0]=true;
	for(int i=1;i<=n;i++)
	{
		if(!vis_jmp[i])
			calc_jmp(i);
		//cerr<<i<<": "<<jmp[i][0]<<"\n";
	}
	while(q--)
	{
		int a,b;
		cin>>a>>b;
		if(a==b)
		{
			cout<<"0\n";
			continue;
		}
		auto [x,c]=far(b,t[a].fi);
		if(t[a].se>t[x].se)
			cout<<"impossible\n";
		else if(t[a].se>=t[x].fi)
			cout<<c+1<<"\n";
		else if(jmp[x][0]==0)
			cout<<"impossible\n";
		else
			cout<<c+2<<"\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...