// In the name of God

#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <deque>
#include <assert.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <stdio.h>
#include <string.h>
#include <utility>
#include <math.h>
#include <bitset>
#include <iomanip>
#include <complex>

using namespace std;

#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i < i##_end_; ++i)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define mp make_pair
#define x first
#define y second
#define pb push_back
#define SZ(x) (int((x).size()))
#define ALL(x) (x).begin(), (x).end()

template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
template<typename T> inline bool smin(T &a, const T &b)   { return a > b ? a = b : a;    }
template<typename T> inline bool smax(T &a, const T &b)   { return a < b ? a = b : a;    }

typedef long long LL;

const int N = (int) 1e6 + 6, mod = (int) 0;
int to_add[N], mark[N], res[N], a[N], b[N], c[N], p[N], add[N];
set<int> q[N];
int main() {
	ios_base::sync_with_stdio(0);
	int n;
	cin >> n;
	for (int j = 0; j < n; ++j)
		cin >> a[j] >> b[j];	
	for (int j = 0; j < n + 1; ++j)
		cin >> c[j];
	sort(c, c + n + 1);
	for (int j = 0; j < n; ++j) {
		a[j] = lower_bound(c, c + n + 1, a[j]) - c;
		b[j] = lower_bound(c, c + n + 1, b[j]) - c;
	}
	for (int j = 0; j < n + 1; ++j) p[j]--;
	for (int j = 0; j < n; ++j) p[a[j]]++;
	for (int j = 1; j < n + 1; ++j) p[j] += p[j - 1];
	for (int j = 0; j < n; ++j) {
		if (a[j] > b[j]) {
			q[a[j] - 1].insert(j);
		}
	}
	int init_res = 0;
	set<pair<int, int>> st;
	
	for (int pos = n; pos >= 0; --pos) {
		for (int j : q[pos]) st.insert(mp(b[j], j));
		add[pos] += add[pos + 1];
		p[pos] += add[pos];
		while (p[pos] < -1) {
			if (st.size()) {
				auto cur = *(st.begin());
				int l = cur.first;
				st.erase(cur);
				if (l > pos) continue;
				mark[cur.second] = 1;
				init_res++;
				to_add[a[cur.second] - 1]++;
				to_add[pos]--;
				add[pos]++;
				p[pos]++;
				if (l >= 1) {
					add[l - 1]--;
				}
			} else {
				init_res = -1e9;
				break;	
			}
		}		
	}
	for (int pos = n; pos >= 0; --pos) {
		to_add[pos] += to_add[pos + 1];
		p[pos] += to_add[pos];
	}
	if (init_res >= 0) {
		res[0] = n - init_res;
		for (int j = 0; j < n + 1; ++j) q[j].clear();
		for (int j = 0; j < n; ++j) if (!mark[j]) {
			if (b[j] < a[j]) {
				q[b[j]].insert(j);
			}	
		}
		st.clear();
		memset(add, 0, sizeof add);
		for (int pos = 0; pos <= n; ++pos) {
			res[pos + 1] = res[pos];
			for (int j : q[pos]) st.insert(mp(-a[j], j));
			if (pos >= 1) add[pos] += add[pos - 1];
			p[pos] += add[pos];
			while (p[pos] == -1) {
				if (st.size()) {
					auto cur = *(st.begin());
					int r = -cur.first;
					st.erase(cur);
					if (r <= pos) continue;
					mark[cur.second] = 1;
					res[pos + 1]--;
					add[pos]++;
					p[pos]++;
					add[r]--;
				} else {
					res[pos + 1] = -1e9;
					break;	
				}
			}		
		}
		for (int j = 0; j <= n + 1; ++j) {
			res[j] = max(res[j], -1);	
		}
	} else {
		memset(res, -1, sizeof res);
	}
	int qn;
	cin >> qn;
	while (qn--) {
		int x, y;
		cin >> x >> y;
		x = lower_bound(c, c + n + 1, x) - c;
		y = lower_bound(c, c + n + 1, y) - c;
		int ansx = (res[x] == -1 ? -1 : res[x] + 1);
		int ansy = (res[y] == -1 ? -1 : res[y]);
		cout << max(ansx, ansy) << '\n';
	}
}





Measured memory_bytes: 73728