#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int N = 1<<17;
int Mn[20][N<<1], Mx[20][N<<1];
vector<int> Add[2][N], rem[2][N];
int L[N], R[N];
void updLR(int j, int l, int r, int &X, int &Y){
for (l += N - 1, r += N + 1; l + 1 < r; l /= 2, r /= 2){
if (!(l & 1))
X = min(X, Mn[j][l ^ 1]), Y = max(Y, Mx[j][l ^ 1]);
if (r & 1)
X = min(X, Mn[j][r ^ 1]), Y = max(Y, Mx[j][r ^ 1]);
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
int n, m, k, q;
cin>>n>>k>>m;
for (int i=1, l, r;i<=m;i++){
cin>>l>>r;
if (l < r){
Add[0][l].push_back(r);
rem[0][min(r+1, l+k)].push_back(r);
}
else{
Add[1][max(r, l-k+1)].push_back(r);
rem[1][l+1].push_back(r);
}
}
multiset<int> st[2];
for (int i=1;i<=n;i++){
for (int j : {0, 1}){
for (int l : Add[j][i])
st[j].insert(l);
for (int l : rem[j][i])
st[j].erase(st[j].find(l));
}
L[i] = R[i] = i;
if (st[0].size() > 0)
R[i] = *rbegin(st[0]);
if (st[1].size() > 0)
L[i] = *begin(st[1]);
}
for (int j=0;j<18;j++){
for (int i=N;i<N+N;i++)
Mn[j][i] = L[i - N], Mx[j][i] = R[i - N];
for (int i=N-1; i; i--){
Mn[j][i] = min(Mn[j][i+i], Mn[j][i+i+1]);
Mx[j][i] = max(Mx[j][i+i], Mx[j][i+i+1]);
}
for (int i=1;i<=n;i++)
updLR(j, L[i], R[i], L[i], R[i]);
}
cin>>q;
for (int i=1;i<=q;i++){
int x, y;
cin>>x>>y;
if (L[x] > y or R[x] < y){
cout<<-1<<'\n';
continue;
}
int l = x, r = x, ans = 1, a, b;
for (int j=17;j + 1; j--){
updLR(j, l, r, a = l, b = r);
if (a > y or b < y)
ans += (1<<j), l = a, r = b;
}
cout<<ans<<'\n';
}
}