#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pi pair<int, int>
#define pl pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(),(x).end()
const int maxn=1e5+10;
const int logg=ceil(log2(maxn));
vector<vi> graph(maxn);
vector<vi> prv(maxn,vi(logg+1));
void dfs(int cur) {
	for (int i=1; i<=logg; i++) {
		prv[cur][i]=prv[prv[cur][i-1]][i-1];
	}
	for (auto to:graph[cur]) {
		dfs(to);
	}
}
struct segTree {
	struct node {
		int ind=-1,val=2e9;
		node(int _ind=-1, int _val=2e9): ind(_ind),val(_val) {}
	};
	node unite(node a, node b) {
		if (a.val<=b.val) {
			return a;
		}
		return b;
	}
	vector<node> seg;
	int sze;
	segTree(int n, vector<pi>& a): sze(n) {
		seg.resize(4*sze);
		build(a,1,0,sze-1);
	}
	void build(vector<pi>& a, int v, int tl, int tr) {
		if (tl==tr) {
			seg[v].val=a[tl].se;
			seg[v].ind=a[tl].fi;
			return;
		}
		int tm=tl+(tr-tl)/2;
		build(a,2*v,tl,tm);
		build(a,2*v+1,tm+1,tr);
		seg[v]=unite(seg[2*v],seg[2*v+1]);
	}
	node get(int l, int r, int v, int tl, int tr) {
		if (l<=tl && tr<=r) {
			return seg[v];
		}
		if (tr<l || r<tl) {
			return node();
		}
		int tm=tl+(tr-tl)/2;
		return unite(get(l,r,2*v,tl,tm),get(l,r,2*v+1,tm+1,tr));
	}
	node get(int l, int r) {
		return get(l,r,1,0,sze-1);
	}
};
int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
	int n,q;
	cin >> n >> q;
	vector<pi> ev(n);
	vi nums(2*n);
	for (int i=0; i<n; i++) {
		cin >> ev[i].fi >> ev[i].se;
		nums[2*i]=ev[i].fi;
		nums[2*i+1]=ev[i].se;
	}
	sort(all(nums));
	nums.erase(unique(all(nums)),nums.end());
	vector<pi> vals(nums.size(),{-1,2e9});
	for (int i=0; i<n; i++) {
		ev[i].fi=lower_bound(all(nums),ev[i].fi)-nums.begin();
		ev[i].se=lower_bound(all(nums),ev[i].se)-nums.begin();
		if (vals[ev[i].se].se>ev[i].fi) {
			vals[ev[i].se]={i,ev[i].fi};
		}
	}
	segTree data(nums.size(),vals);
	for (int i=0; i<n; i++) {
		auto a=data.get(ev[i].fi,ev[i].se);
		if (a.val>=ev[i].fi) {
			prv[i][0]=n;
			graph[n].pb(i);
		}
		else {
			prv[i][0]=a.ind;
			graph[a.ind].pb(i);
		}
	}
	dfs(n);
	int a,b;
	for (int i=0; i<q; i++) {
		cin >> a >> b;
		a--;
		b--;
		if (ev[a].se>ev[b].se) {
			cout << "impossible\n";
			continue;
		}
		else if (a==b) {
			cout << "0\n";
			continue;
		}
		else if (ev[b].fi<=ev[a].se) {
			cout << "1\n";
			continue;
		}
		int ans=0;
		for (int j=logg; j>=0; j--) {
			if (prv[b][j]==n) {
				continue;
			}
			if (ev[prv[b][j]].fi>ev[a].se) {
				b=prv[b][j];
				ans|=(1<<j);
			}
		}
		ans++;
		b=prv[b][0];
		if (b==n || ev[b].fi>ev[a].se) {
			cout << "impossible\n";
		}
		else {
			cout << ans+1 << '\n';
		}
	}
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |