Submission #1150415

#TimeUsernameProblemLanguageResultExecution timeMemory
1150415vako_pEvent Hopping (BOI22_events)C++20
100 / 100
85 ms21948 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back

const int mxN = 1e6 + 5;
ll n,q,p[mxN][20],idx[mxN];
pair<ll,pair<ll,ll>> a[mxN];	
	
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> q;
	for(int i = 1; i <= n; i++){
		cin >> a[i].second.first >> a[i].first;
		a[i].second.second = i;
	}	
	sort(a + 1, a + n + 1);
	for(int i = 1; i <= n; i++){
		idx[a[i].second.second] = i;
	}
	vector<pair<ll,ll>> st;
	for(int i = 1; i <= n; i++){
		auto it = lower_bound(st.begin(), st.end(), make_pair(a[i].second.first, 0LL));
		if(it == st.end()){
			for(int j = 0; j < 20; j++) p[i][j] = i;
		}
		else{
			p[i][0] = (*it).second;
			for(int j = 1; j < 20; j++) p[i][j] = p[p[i][j - 1]][j - 1];
		}
		while(!st.empty()){
			if(a[st[st.size() - 1].second].second.first >= a[i].second.first)
				st.pop_back();
			else break;
		}
		st.pb({a[i].first, i});
	}
	while(q--){
		ll x,y;
		cin >> x >> y;
		x = idx[x];
		y = idx[y];
		if(x == y){
			cout << 0 << '\n';
			continue;
		}
		if(a[y].first < a[x].first){
			cout << "impossible" << '\n';
			continue;
		}
		if(a[y].second.first <= a[x].first){
			cout << 1 << '\n';
			continue;
		}
		ll ans = 2;
		for(int i = 19; i >= 0; i--){
			if(a[p[y][i]].second.first > a[x].first){
				y = p[y][i];
				ans += (1LL << i);
			}
		}
		y = p[y][0];
		if(a[y].second.first > a[x].first){
			cout << "impossible" << '\n';
			continue;
		}
		cout << ans << '\n';
	}
}
 
#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...