#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;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin >> n >> q;
vector<tiii>arr(n);
for(int i = 0; i < n; i++){
int a,b;
cin >> a >>b;
arr[i] = {a,b,i};
}
sort(arr.begin(),arr.end(), [](tiii a, tiii b){return get<1>(a) < get<1>(b);});
map<int,int> newInd;
for(int i = 0; i < n; i++){
newInd[get<2>(arr[i])] = i;
}
vector<vector<int>> ans(n,vector<int>(n,INF));
for(int i = n-1; i >= 0; i--){
int pt = n;
set<pii> cur;
priority_queue<tiii> active;
cur.insert({0,i});
active.push({get<0>(arr[i]),i,0});
ans[i][i] = 0;
while(--pt >= 0){
if(pt == i) continue;
if(get<1>(arr[pt]) > get<1>(arr[i])) continue;
while(active.size() && get<0>(active.top()) > get<1>(arr[pt])){
int st, c, ind;
tie(st, ind,c) = active.top(); active.pop();
cur.erase({c,ind});
}
if(cur.size()) ans[pt][i] = (*cur.begin()).first+1;
else break;
cur.insert({ans[pt][i], pt});
active.push({get<0>(arr[pt]), pt, ans[pt][i]});
}
}
while(q--){
int s,t;
cin >> s >> t;
s--;t--;
s = newInd[s];
t = newInd[t];
if(ans[s][t] >= INF){
cout << "impossible\n";
continue;
}else{
cout << ans[s][t] << "\n";
}
}
}