#include <bits/stdc++.h>

typedef std::pair <int, int> pr;
const int N = 100054, INF = 0x3f3f3f3f;

int n, q;
int c[N], C[N], x[N];
int last[N], ans[N];
pr a[N];
std::priority_queue <int> pq;

inline int min(const int x, const int y) {return x < y ? x : y;}
inline void down(int &x, const int y) {x > y ? x = y : 0;}
inline int pos(int val) {return std::lower_bound(x, x + n, val) - x;}

int main() {
	int i, j, r, cur = 0, cov = 0; bool fail = false;
	scanf("%d", &n), ++n;
	for (i = 1; i < n; ++i) scanf("%d%d", &a[i].first, &a[i].second);
	for (i = 0; i < n; ++i) scanf("%d", x + i);
	std::sort(x, x + n);
	for (i = 1; i < n; ++i) down(a[i].second = pos(a[i].second), a[i].first = pos(a[i].first));
	std::fill(c, c + n, -1);
	for (i = 1; i < n; ++i) ++c[a[i].first], std::swap(a[i].first, a[i].second);
	std::sort(a + 1, a + n);

	for (j = 1, i = 0; i < n; ++i) {
		for (cur += c[i]; j < n && a[j].first == i; ++j) pq.emplace(a[j].second);
		for (r = INF; !pq.empty() && pq.top() > i && cur < 0; r = pq.top(), pq.pop(), ++cur, ++cov, --c[r]);
		for (; !pq.empty() && pq.top() <= i; pq.pop());
		
		C[i] = cur, last[i] = r;
		if (cur < -1) {fail = true; break;}
	}
	scanf("%d", &q);
	if (fail) {for (; q; --q) puts("-1"); return 0;}
	for (r = i = n - 1; i >= 0; --i) ~C[i] ? last[i] <= r && (r = i, --cov) : (r = j = i), ans[i] = cov;
	memset(ans + (j + 1), 63, (n - j + 5) << 2);
	
	for (; q; --q)
		scanf("%d%d", &i, &j), r = min(ans[pos(i)], ans[pos(j)] + 1),
		printf("%d\n", r >= INF ? -1 : n - r);
	return 0;
}