#include <bits/stdc++.h>
using namespace std;
#define int long long
#define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//#define mod 1000000007
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back
vector<pii> seg,idk;
void build(int v, int l, int r){
	//cout<<v<<'\n';
	if(l>r) return;
	if(l==r){
		seg[v]=idk[l];
	}else{
		int m=(l+r)/2;
		build(2*v,l,m);
		build(2*v+1,m+1,r);
		seg[v]=max(seg[2*v],seg[2*v+1]);
	}
}
/*
void build(int v, int tl, int tr) {
	cout<<v<<'\n';
    if (tl == tr) {
        seg[v] = idk[tl];
    } else {
        int tm = (tl + tr) / 2;
        build(v*2, tl, tm);
        build(v*2+1, tm+1, tr);
        seg[v] = max(seg[v*2],seg[v*2+1]);
    }
}*/
pii get(int v, int l, int r, int cl, int cr){
	if(cl>cr){
		return {0,-1};
	}
	if(l==cl and r==cr){
		return seg[v];
	}else{
		int m=(l+r)/2;
		return max(get(2*v,l,m,cl,min(cr,m)),get(2*v+1,m+1,r,max(m+1,cl),cr));
	}
}
int32_t main(){
	speedIO;
	int t,n,m,k,q;
	//cin>>t;
	t=1;
	while(t--){
		cin>>n>>q;
		int s[n],e[n];
		vector<pii> start(n);
		for(int i=0;i<n;i++){
			cin>>s[i]>>e[i];
			start[i]={s[i],i};
		}
		sort(start.begin(),start.end());
		vector<int> best(n),bruh(n),pos(n);
		idk.resize(n+1);
		for(int i=0;i<n;i++){
			idk[i+1].f=e[start[i].s];
			idk[i+1].s=start[i].s;
			pos[start[i].s]=i;
			bruh[i]=start[i].f;
			//cout<<idk[i+1].f<<' '<<idk[i+1].s<<'\n';
		}
		//cout<<'\n';
		seg.resize(4*n+5,{0,-1});
		build(1,1,n);
		//cout<<get(1,1,n,1,3).f<<' '<<get(1,1,n,1,3).s<<'\n';
		
		for(int i=0;i<n;i++){
			int l=s[i],r=e[i];
			int idx=upper_bound(bruh.begin(),bruh.end(),r)-bruh.begin();
			idx--;
			//cout<<idx<<'\n';
			if(idx==-1){
				best[i]=-1;
			}else{
				//pii tmp=max(get(1,1,n,1,pos[i]),get(1,1,n,pos[i]+2,idx+1));
				pii tmp=get(1,1,n,1,idx+1);
				if(tmp.f>=e[i]){
					best[i]=tmp.s;
				}else{
					best[i]=-1;
				}
				if(best[i]==i){
					best[i]=-1;
				}
			}
		}
		/*for(int i:best){
			cout<<i<<' ';
		}
		cout<<'\n';*/
			
		while(q--){
			int x,y;
			cin>>x>>y;
			x--;y--;
			if(x==y){
				cout<<0<<'\n';
				continue;
			}
			int cl=s[x],cr=e[x];
			int el=s[y],er=e[y];
			int ans=0;
			bool flag=true;
			if(er<cr) flag=false;
			//cout<<"hi "<<cl<<' '<<cr<<' '<<el<<' '<<er<<'\n';
			while(el>cr){
				ans++;
				if(er<cr) flag=false;
				if(best[x]==-1){
					flag=false;
					break;
				}
				x=best[x];
				cl=s[x];
				cr=e[x];
				
			}
			if(er<cr) flag=false;
			if(flag){
				cout<<ans+1<<'\n';
			}else{
				cout<<"impossible\n";
			}
		}
		
		
		
		
		
		
	
	
	
		
		
	}
	return 0;
}
| # | 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... |