#include<bits/stdc++.h>
using namespace std;
#define sg pair<int,int>
#define f first
#define s second
int jmp[100001][18] = {};
int main() {
vector<sg> seg;
int n,q; cin >> n >> q;
vector<int> vals;
for(int i = 0; i < n; i++) {
int a,b; cin >> a >> b;
seg.push_back({a,b});
vals.push_back(a);
vals.push_back(b);
}
vals.push_back(0);
sort(vals.begin(),vals.end());
vals.erase(unique(vals.begin(),vals.end()),vals.end());
for(int i = 0; i < n; i++) {
sg t = seg[i];
t.f = lower_bound(vals.begin(),vals.end(), t.f) - vals.begin();
t.s = lower_bound(vals.begin(),vals.end(), t.s) - vals.begin();
seg[i] = t;
}
vector<vector<pair<sg,int>>> ev(vals.size());
for(int i = 0; i < n; i++) {
sg t = seg[i];
ev[t.f].push_back({{t.f, t.s}, i});
ev[t.s].push_back({{-t.f, t.s}, i});
}
//init to 0, so no worry
jmp[0][0] = 0;
multiset<pair<pair<int,int>,int>> sl;
for(int i = 1; i < ev.size(); i++) {
sort(ev[i].begin(), ev[i].end());
reverse(ev[i].begin(), ev[i].end());
for(auto e : ev[i]) {
if(e.f.f > 0) {
sl.insert(e);
int ch = (*sl.begin()).second;
if(seg[ch].second > seg[e.second].second) continue;
jmp[e.second][0] = ch;
int o = e.second;
for(int j = 1; j < 18; j++) {
jmp[o][j] = jmp[jmp[o][j-1]][j-1];
}
} else {
auto it = sl.find({{e.f.f * (-1), e.f.s}, e.second});
if(it != sl.end()) sl.erase(it);
}
}
}
for(int k = 0; k < q; k++) {
int a,b; cin >> a >> b;
a--; b--;
int x1,x2;
x1 = seg[a].f;
x2 = seg[a].s;
int ans = 0;
if(a == b) {
cout << 0 << endl;
continue;
}
if(seg[a].second > seg[b].second) {
cout << "impossible" << endl;
continue;
}
if(seg[b].first <= seg[a].second) {
cout << "1" << endl;
continue;
}
for(int i = 17; i >= 0; i--) {
//if 2 pow i back is still before it
int y = jmp[b][i];
sg t = seg[y];
if(x2 < t.first) {
ans += (1 << i);
b = y;
}
}
ans++;
b = jmp[b][0];
if((seg[b].first <= x2 and seg[b].second >= x2) or a==b) {
cout << ans + 1 << endl;
continue;
} else {
cout << "impossible" << endl;
continue;
}
}
}