#include <bits/stdc++.h>
using namespace std;
using ld = long double;
using ll = long long;
const ll INF = 1e18, MOD = 1e9 + 7;
void solve();
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
int q = 1;
while (q--) {
solve();
}
}
struct sparse_table1 {
vector<vector<ll>> v;
vector<ll> a;
ll n;
void build(ll n_, vector<ll> &b) {
v.resize(__lg(n_) + 1, vector<ll>(n_));
n = n_;
a = b;
for (int i = 0; i < n; i++) {
v[0][i] = a[i];
}
for (int j = 1; j <= __lg(n); j++) {
for (int i = 0; i + (1 << j) <= n; i++) {
v[j][i] = min(v[j - 1][i], v[j - 1][i + (1 << (j - 1))]);
}
}
}
ll query(ll l, ll r) {
ll j = __lg(r - l);
return min(v[j][l], v[j][r - (1 << j)]);
}
};
struct sparse_table2 {
vector<vector<ll>> v;
vector<ll> a;
ll n;
void build(ll n_, vector<ll> &b) {
v.resize(__lg(n_) + 1, vector<ll>(n_));
n = n_;
a = b;
for (int i = 0; i < n; i++) {
v[0][i] = a[i];
}
for (int j = 1; j <= __lg(n); j++) {
for (int i = 0; i + (1 << j) <= n; i++) {
v[j][i] = max(v[j - 1][i], v[j - 1][i + (1 << (j - 1))]);
}
}
}
ll query(ll l, ll r) {
ll j = __lg(r - l);
return max(v[j][l], v[j][r - (1 << j)]);
}
};
sparse_table2 t1;
sparse_table1 t2;
ll f1(ll l, ll r, ll t) {
ll cnt = 0;
while (true) {
if (t1.query(l, r + 1) >= t) return cnt + 1;
ll nw = max(r, t1.query(l, r + 1));
if (nw == r) return INF;
r = nw;
cnt++;
}
}
ll f2(ll l, ll r, ll t) {
ll cnt = 0;
while (true) {
if (t2.query(l, r + 1) <= t) return cnt + 1;
ll nw = min(l, t2.query(l, r + 1));
if (nw == l) return INF;
l = nw;
cnt++;
}
}
void solve() {
ll n, k; cin >> n >> k;
vector<ll> e1(n, -1), e2(n, n);
ll m; cin >> m;
for (int i = 0; i < m; i++) {
ll a, b; cin >> a >> b;
a--, b--;
if (a <= b) {
e1[a] = max(e1[a], b);
} else {
e2[a] = min(e2[a], b);
}
}
t1.build(n, e1);
t2.build(n, e2);
ll q; cin >> q;
while (q--) {
ll s, t; cin >> s >> t;
s--, t--;
ll cnt = 0;
ll ans = INF;
if (s < t) {
ll l = s, r = s;
while (true) {
ans = min(ans, cnt + f1(max(0ll, l - k + 1), r, t));
ll nw = min(l, t2.query(l, min(r + k - 1, n - 1) + 1));
if (nw == l) break;
cnt++;
l = nw;
}
} else {
ll l = s, r = s;
while (true) {
ans = min(ans, cnt + f2(l, min(n - 1, r + k - 1), t));
ll nw = max(r, t1.query(max(0ll, l - k + 1), r + 1));
if (nw == r) break;
cnt++;
r = nw;
}
}
if (ans >= INF) cout << -1 << '\n';
else cout << ans << '\n';
}
}