#include<bits/stdc++.h>
typedef int ll;
#define pii pair<ll, ll>
#define fi first
#define se second
#define endl '\n'
#define TASK ""
#define N 100005
#define LOG 17
using namespace std;
// da xem goi y
const ll inf = 1e9;
bool ghuy4g;
ll n, k, m, q;
pii p[N][LOG + 2];
vector<pii> vt1, vt2;
bool cmp(pii a, pii b) {
	return a.fi > b.fi;
}
pii st[LOG + 2][4 * N];
pii cb(pii a, pii b) {
	return {min(a.fi, b.fi), max(a.se, b.se)};
}
void build(ll tt, ll id, ll l, ll r) {
	if (l == r) {
		st[tt][id] = p[l][tt];
		return;
	}
	ll mid = (l + r) / 2;
	build(tt, id * 2, l, mid);
	build(tt, id * 2 + 1, mid + 1, r);
	st[tt][id] = cb(st[tt][id * 2], st[tt][id * 2 + 1]);
}
pii get(ll tt, ll id, ll l, ll r, ll L, ll R) {
	if (l > R || r < L) return {inf, -inf};
	if (L <= l && r <= R) {
		return st[tt][id];
	}
	ll mid = (l + r) / 2;
	return cb(get(tt, id * 2, l, mid, L, R), get(tt, id * 2 + 1, mid + 1, r, L, R));
}
void pre2() {
	for (int j = 1; j <= LOG; j ++) {
		build(j - 1, 1, 1, n);
		for (int i = 1; i <= n; i ++) {
			pii prev = p[i][j - 1];
			pii nxt = get(j - 1, 1, 1, n, prev.fi, prev.se);
			p[i][j] = nxt;
		}
	}
	build(LOG, 1, 1, n);
}
void pre() {
	sort(vt1.begin(), vt1.end());
	priority_queue<pii, vector<pii>, greater<pii>> pq;
	ll cur = 0;
	multiset<pii> s;
	for (int i = 1; i <= n; i ++) {
		while (cur < vt1.size() && vt1[cur].fi <= i) {
			s.insert({vt1[cur].se, cur});
			pq.push({min(vt1[cur].fi + k - 1, vt1[cur].se - 1), cur});
			cur ++ ;
		}
		while (pq.size() && pq.top().fi < i) {
			ll id = pq.top().se;
			pq.pop();
			s.erase(s.find({vt1[id].se, id}));
		}
		if (s.size()) {
			p[i][0].se = (*s.rbegin()).fi;
		}
		else {
			p[i][0].se = i;
		}
	}
	sort(vt2.begin(), vt2.end(), cmp);
	/*for (auto it : vt2) {
		cout << "vt2 " << it.fi << " " << it.se << endl;
	}*/
	cur = 0;
	s.clear();
	priority_queue<pii> pq2;
	for (int i = n; i >= 1; i --) {
		while (cur < vt2.size() && vt2[cur].fi >= i) {
			s.insert({vt2[cur].se, cur});
			pq2.push({max(vt2[cur].fi - k + 1, vt2[cur].se + 1), cur});
			cur ++ ;
		}
		while (pq2.size() && pq2.top().fi > i) {
			ll id = pq2.top().se;
			pq2.pop();
			s.erase(s.find({vt2[id].se, id}));
		}
		if (s.size()) {
			p[i][0].fi = (*s.begin()).fi;
		}
		else {
			p[i][0].fi = i;
		}
	}
	pre2();
}
pii kth_par(ll u, ll k) {
	pii cur = {u, u};
	for (int j = LOG; j >= 0; j --) {
		if (k >= (1 << j)) {
			k -= (1 << j);
			cur = cb(cur, get(j, 1, 1, n, cur.fi, cur.se));
		}
	}
	return cur;
}
void solve() {
	//in();
	cin >> q;
	for (int i = 1; i <= q; i ++) {
		ll u, v;
		cin >> u >> v;
		if (u == v) {
			cout << 0 << endl;
			continue;
		}
		pii xet = kth_par(u, n);
		if (!(xet.fi <= v && v <= xet.se)) {
			cout << -1 << endl;
			continue;
		}
		pii cur = {u, u};
		ll res = 0;
		for (int j = LOG; j >= 0; j --) {
			xet = get(j, 1, 1, n, cur.fi, cur.se);
			pii nxt = cb(xet, cur);
			if (nxt.fi <= v && v <= nxt.se) {
				
			}
			else {
				cur = xet;
				res += (1 << j);
			}
		}
		cur = cb(cur, get(0, 1, 1, n, cur.fi, cur.se));
		res ++ ;
		cout << res << endl;
	}	
}
bool klinh;
signed main() {
   // freopen("test.inp", "r", stdin);
	//freopen("test.out", "w", stdout);
	//srand(time(0));
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
   	cin >> n >> k;
   	cin >> m;
   	for (int i = 1; i <= m; i ++) {
   		ll u, v;
   		cin >> u >> v;
   		if (u < v) {
   			vt1.push_back({u, v});
   		}
   		else {
   			vt2.push_back({u, v});
   		}
   	}
   	
   	pre();
   	solve();
   	
   	cerr << fabs(&klinh - &ghuy4g) / double(1024 * 1024);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |