Submission #1216436

#TimeUsernameProblemLanguageResultExecution timeMemory
1216436MuhammadSaramEvent Hopping (BOI22_events)C++20
30 / 100
558 ms41788 KiB
/********************* بسم الله الرحمن الرحيم ***********************/
 /******************** ٱلْحَمْدُ لِلَّٰهِ رَبِّ ٱلْعَالَمِينَ *************************/
/******************* Prophet Muhammad صلى الله عليه وسلم ************/
   /*********************** وَقُل رَّبِّ زِدْنِي عِلْمًا **************************/

#include <bits/stdc++.h>

using namespace std;

const int M = 1e5 + 1, lg = 17, inf = 1e9+5;

pair<int,int> seg[M*2];
int par[M][lg];

void modify(int p,int x,int id,int v=0,int s=1,int e=M+1)
{
	if (s+1==e)
	{
		if (x==inf) seg[v]={x,id};
		else seg[v]=min(seg[v],{x,id});
		return;
	}
	int mid=(s+e)/2,lc=v+1,rc=v+(mid-s)*2;
	if (p<mid)
		modify(p,x,id,lc,s,mid);
	else
		modify(p,x,id,rc,mid,e);
	seg[v]=min(seg[lc],seg[rc]);
}

pair<int,int> get(int l,int r,int v=0,int s=1,int e=M+1)
{
	if (l>=e or r<=s)
		return {inf,0};
	if (l<=s && e<=r)
		return seg[v];
	int mid=(s+e)/2,lc=v+1,rc=v+(mid-s)*2;
	return min(get(l,r,rc,mid,e),get(l,r,lc,s,mid));
}

int main()
{
	for (int i=0;i<M*2;i++) seg[i]={inf,0};
	
	int n,q;
	cin>>n>>q;
	int s[n+1]={},e[n+1];
	map<int,vector<int>,greater<int>> mp;
	set<int> se;
	for (int i=1;i<=n;i++)
	{
		cin>>s[i]>>e[i];
		mp[s[i]].push_back(i);
		mp[e[i]].push_back(i);
		se.insert(e[i]);
	}
	map<int,int> ind;
	for (int i:se)
		ind[i]=ind.size();
	se.clear();
	for (auto [x,v]:mp)
	{
		for (auto i:v)
			if (!se.count(i))
				modify(ind[e[i]],s[i],i);
		for (auto i:v)
			if (se.count(i))
			{
				pair<int,int> p=get(1,ind[e[i]]+1);
				if (p.first<s[i])
					par[i][0]=p.second;
			}
		for (auto i:v)
			if (se.count(i))
				modify(ind[e[i]],inf,0),se.erase(i);
			else
				se.insert(i);
	}
	for (int p=1;p<lg;p++)
		for (int i=1;i<=n;i++)
			par[i][p]=par[par[i][p-1]][p-1];
	while (q--)
	{
		int x,y;
		cin>>x>>y;
		if (x==y)
			cout<<0<<endl;
		else if(s[y]<=e[x] && e[x]<=e[y])
			cout<<1<<endl;
		else if(e[x]>e[y])
			cout<<"impossible"<<endl;
		else
		{
			int ans=2,dm=y;
			for (int p=lg-1;p>=0;p--)
				if (s[par[dm][p]]>e[x])
					dm=par[dm][p],ans+=(1<<p);
			if (par[dm][0])
				cout<<ans<<endl;
			else
				cout<<"impossible"<<endl;
		}
	}
	
	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...