제출 #857139

#제출 시각아이디문제언어결과실행 시간메모리
857139hailEvent Hopping (BOI22_events)C++17
100 / 100
109 ms30488 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long
#define pb push_back
#define fi first
#define se second
#define ld long double
#define pi pair<int, int>

const int INF = (int)4e18;
const int MODa = 1e9 + 7;
const int MOD = 998244353;

const int MXN = 100005;
int n, q;
int l[MXN]{};
int r[MXN]{};

int bl[MXN][25]{};

int cs(int a, int b)
{
	if(r[a]==r[b]) return l[a]>l[b];
	return r[a]>r[b];
}

int seg[4*MXN]{};
vector<int> ss(0);
vector<int> sl(0);

void build(int sl, int sr, int p)
{
	if(sl==sr)
	{
		seg[p] = ss[sl];
		return;
	}

	int m = (sl+sr)/2;
	build(sl, m, 2*p);
	build(m+1, sr, 2*p + 1);
	if(l[seg[2*p]]<=l[seg[2*p + 1]]) seg[p] = seg[2*p];
	else seg[p] = seg[2*p + 1];
}

int query(int sl, int sr, int p, int ql, int qr)
{
	if(sl>qr || ql>sr) return 0;
	if(ql<=sl && sr<=qr) return seg[p];

	int m = (sl+sr)/2;
	int x = query(sl, m, 2*p, ql, qr);
	int y = query(m+1, sr, 2*p + 1, ql, qr);
	if(l[x]<=l[y]) return x;
	return y;
}

void solve()
{
	cin>>n>>q;

	l[0] = INF;

	for(int i=1; i<=n; i++)
	{
		cin>>l[i]>>r[i];
	}

	ss.resize(n+1);
	sl.resize(n+2);
	iota(ss.begin(), ss.end(), 0);

	sort(ss.begin()+1, ss.end(), cs);

	for(int i=1; i<=n; i++)
	{
		sl[i] = -r[ss[i]];
	}

	build(1, n, 1);

	for(int i=1; i<=n; i++)
	{
		int j = ss[i];
		int lm = -l[j];
		int el = upper_bound(sl.begin()+1, sl.end(), lm) - sl.begin();
		bl[j][0] = query(1, n, 1, i, el-1);
	}

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

	for(int i=1; i<=q ;i++)
	{
		int s, e;
		cin>>s>>e;
		if(r[s]>r[e])
		{
			cout<<"impossible\n";
			continue;
		}
		int ans = 0;
		if(s==e)
		{
			cout<<0<<"\n";
			continue;
		}
		if(r[s]>=l[e])
		{
			cout<<1<<"\n";
			continue;
		}
		if(l[bl[e][24]]>r[s])
		{
			cout<<"impossible\n";
			continue;
		}
		int x = e;
		for(int j=24; j>=0; j--)
		{
			if(l[bl[x][j]]<=r[s]) continue;
			ans += (1<<j);
			x = bl[x][j];
		}
		cout<<ans+2<<"\n";
	}

}


signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int t = 1;	
	//cin>>t;
	while(t--)
	{
		solve();
	}
	
}
#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...