Submission #854671

#TimeUsernameProblemLanguageResultExecution timeMemory
854671PoPularPlusPlusEvent Hopping (BOI22_events)C++17
30 / 100
111 ms17352 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define all(x) x.begin(),x.end()
#define vf first 
#define vs second
const int mod = 998244353;

const int MX = 1000000005;
const int L = 20;

struct Seg {
	int siz;
	vector<pair<int,int>> v;

	void init(int n){
		siz = 1;
		while(siz < n)siz *= 2;
		v.assign(siz*2,mp(MX,-1));
	}

	pair<int,int> merge(pair<int,int> x , pair<int,int> y){
		pair<int,int> res;
		res.vf = min(x.vf , y.vf);
		if(x.vf == y.vf)res.vs = min(x.vs , y.vs);
		else if(res.vf == x.vf)res.vs = x.vs;
		else res.vs = y.vs;
		return res;
	}

	void set(int i , pair<int,int> p , int x , int lx , int rx){
		if(rx - lx == 1){
			v[x] = merge(p,v[x]);
			return;
		}
		int m = (lx + rx)/2;
		if(i < m)
			set(i , p , 2 * x + 1 , lx , m);
		else 
			set(i , p , 2 * x + 2 , m , rx);
		v[x] = merge(v[2 * x + 1] , v[2 * x + 2]);
	}

	void set(int i , pair<int,int> p){
		set(i , p , 0 , 0 , siz);
	}

	pair<int,int> range_mx(int l , int r , int x , int lx , int rx){
		if(l >= rx || lx >= r)return mp(MX,-1);
		if(lx >= l && rx <= r)return v[x];
		int m = (lx + rx)/2;
		return merge(range_mx(l,r,2*x+1,lx,m),range_mx(l,r,2*x+2,m,rx));
	}

	pair<int,int> range_mx(int l , int r){
		return range_mx(l , r , 0 , 0 , siz);
	}
};

void solve(){
	int n , q;
	cin >> n >> q;
	vector<pair<int,int>> v(n);
	for(int i = 0; i < n; i++){
		cin >> v[i].vf >> v[i].vs;
	}

	// positions acocrding to sorted e

	vector<pair<int,pair<int,int>>> e_sort;
	//vector<pair<int,pair<int,int>>> rev;

	for(int i = 0; i < n; i++){
		e_sort.pb(mp(v[i].vs , mp(v[i].vf,i)));
	}
	sort(all(e_sort));
	//rev = e_sort;
	//reverse(all(rev));
	int pos[n];
	for(int i = 0; i < n; i++){
		pos[e_sort[i].vs.vs] = i;
	}

	// segtree 

	Seg st;
	st.init(n + 1);
	for(int i = n - 1; i >= 0; i--){
		st.set(i,mp(e_sort[i].vs.vf , i));
	}

	// binary lifting

	int up[n][L];
	int p[n];
	for(int i = 0; i < n; i++){
		pair<int,pair<int,int>> tp = mp(e_sort[i].vs.vf , mp(-1 , -1));
		int left = (lower_bound(all(e_sort),tp) - e_sort.begin());
		if(left == i)
			up[i][0] = p[i] = i;
		else {
			p[i] = st.range_mx(left,i).vs;
			//cout << left << ' ' << st.range_mx(left,i).vf << ' ' << p[i] << '\n';
			up[i][0] = left;
		}
	}
	for(int j = 1; j < L; j++){
		for(int i = 0; i < n; i++){
			if(j == 1)
				up[i][j] = up[p[i]][j-1];
			else 
				up[i][j] = up[up[i][j-1]][j-1];
		}
	}

	// answering the queries 

	while(q--){
		int s , e;
		cin >> s >> e;
		s--;
		e--;
		if(s == e){
			cout << 0 << '\n';
			continue;
		}
		int ogs = pos[s]  , oge = pos[e];
		if(ogs > oge){
			if(v[s].vs >= v[e].vf && v[s].vs <= v[e].vs){
				cout << 1 << '\n';
				continue;
			}
			else {
				cout << "impossible\n";
				continue;
			}
		}
		int i = oge;
		int ans = 0;
		for(int j = L-1; j >= 0; j--){
			if(up[i][j] > ogs){
				ans += (1<<j);
				i = up[i][j];
			}
		}
		if(i > ogs){
			i = up[i][0];
			ans++;
		}
		if(i > ogs)
			cout << "impossible\n";
		else 
			cout << ans << "\n";
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	//int t;cin >> t;
	//while(t--)
		solve();
	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...