#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;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin >> n >> q;
vector<pii>arr(n);
vector<tiii>carr(n);
for(int i = 0; i < n; i++){
int a,b;
cin >> a >>b;
arr[i] = {a,b};
carr[i] = {a,b,i};
}
sort(carr.begin(),carr.end(), [](tiii a, tiii b){return get<1>(a) < get<1>(b);});
sort(arr.begin(),arr.end(), [](pii a, pii b){return a.second < b.second;});
vector<int> newInd(n);
for(int i = 0; i < n; i++){
newInd[get<2>(carr[i])] = i;
}
vector<vector<int>> ans(n,vector<int>(n,INF));
int m = n-1;
for(int i = n-1; i >= 0; i--){
int pt = m;
set<pii> cur;
priority_queue<tiii> active;
cur.insert({0,i});
active.push({get<0>(arr[i]),i,0});
ans[i][i] = 0;
bool f = false;
while(--pt >= 0){
if(arr[pt].second > arr[i].second) continue;
else if(!f){
f = true;
m = pt+20;
}
if(pt == i) continue;
while(active.size() && get<0>(active.top()) > arr[pt].second){
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({arr[pt].first, 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";
}
}
}