// #pragma GCC optimize("O3,unroll-loops,Ofast")
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define tiii tuple<int,int,int>
using namespace std;
int INF = numeric_limits<int>::max()/2;
struct SegmentTree{
int len = 1;
vector<pii> S;
SegmentTree(int n){
while(len < n) len <<= 1;
S.resize(2*len, {INF,-1});
}
void upd(int i, pii v){
i += len;
S[i] = min(S[i],v);
for( i /= 2; i > 0; i/=2){
S[i] = min(S[i*2],S[i*2+1]);
}
}
pii query(int ql, int qr, int l = 0, int r = -2, int i = 1){
if(r == -2) r = len;
if(ql <= l && r <= qr) return S[i];
if(r <= ql|| qr <= l) return {INF,-1};
int mid = (l+r)/2;
return min(query(ql,qr,l,mid,i*2),query(ql,qr,mid,r,i*2+1));
}
};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin >> n >> q;
vector<pii>arr(n);
for(int i = 0; i < n; i++){
int a,b;
cin >> a >>b;
arr[i] = {a,b};
}
int MAXA = 0;
{
set<int> occ;
for(int i = 0; i < n; i++){
occ.insert(arr[i].first);
occ.insert(arr[i].second);
}
vector<int> sorted(occ.begin(),occ.end());
map<int,int> toInd;
for(int i = 0; i < sorted.size(); i++){
toInd[sorted[i]] = i;
}
MAXA= sorted.size()-1;
for(int i = 0; i < n; i++){
arr[i] = {toInd[arr[i].first],toInd[arr[i].second]};
}
}
SegmentTree seg(MAXA+1);
for(int i = 0; i < n; i++){
seg.upd(arr[i].second, {arr[i].first,i});
}
vector<int> prev(n);
for(int i = 0; i < n; i++){
prev[i] = seg.query(arr[i].first,arr[i].second+1).second;
}
while(q--){
int s,t;
cin >> s >> t;
s--;t--;
int cnt = 0;
int v = t;
while(v != -1){
if(v == s) break;
cnt++;
if(arr[s].second >= arr[v].first && arr[s].second <= arr[v].second){
break;
}
if(v == prev[v]){
v = -1;
break;
}
v = prev[v];
}
if(v == -1){
cout << "impossible\n";
continue;
}else{
cout << cnt << "\n";
}
}
}