#include <bits/stdc++.h> 
using namespace std; 
int gi() { 
	int res = 0, w = 1; 
	char ch = getchar(); 
	while (ch != '-' && !isdigit(ch)) ch = getchar(); 
	if (ch == '-') w = -1, ch = getchar(); 
	while (isdigit(ch)) res = res * 10 + ch - '0', ch = getchar(); 
	return res * w; 
} 
const int MAX_N = 1e5 + 5; 
int N, M, A[MAX_N], B[MAX_N], C[MAX_N], ans[MAX_N]; 
int c[MAX_N]; 
int lb(int x) { return x & -x; } 
void add(int x, int v) { while (x <= N) c[x] += v, x += lb(x); } 
int sum(int x) { int res = 0; while (x) res += c[x], x -= lb(x); return res; } 
vector<int> pot[MAX_N];
bool used[MAX_N]; 
#define fi first
#define se second
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q; 
int main () { 
#ifndef ONLINE_JUDGE 
    freopen("cpp.in", "r", stdin); 
#endif 
	N = gi() + 1; 
	for (int i = 1; i < N; i++) A[i] = gi(), B[i] = gi(); 
	for (int i = 1; i <= N; i++) C[i] = gi(); 
	sort(&C[1], &C[N + 1]); 
	for (int i = 1; i < N; i++) A[i] = lower_bound(&C[1], &C[N + 1], A[i]) - C; 
	for (int i = 1; i < N; i++) B[i] = lower_bound(&C[1], &C[N + 1], B[i]) - C; 
	for (int i = 1; i < N; i++) if (B[i] < A[i]) pot[A[i] - 1].push_back(i); 
	for (int i = 1; i <= N; i++) add(i, -1); 
	for (int i = 1; i < N; i++) add(A[i], 1); 
	int now = N - 1; 
	M = gi(); 
	for (int i = N; i; i--) { 
		int q = -1 - sum(i); 
		for (int j : pot[i]) Q.push(make_pair(B[j], j)); 
		while (q-- > 0) { 
			if (Q.empty() || Q.top().fi > i) { while (M--) puts("-1"); return 0; } 
			int t = Q.top().se; used[t] = 1; Q.pop(); 
			add(B[t], 1), add(A[t], -1), --now; 
		} 
	} 
	while (!Q.empty()) Q.pop(); 
	for (int i = 1; i <= N; i++) pot[i].clear(); 
	for (int i = 1; i < N; i++) if (B[i] < A[i] && !used[i]) pot[B[i]].push_back(i); 
	for (int i = 1; i <= N; i++) { 
		ans[i] = now; 
		int q = -sum(i); 
		for (int j : pot[i]) if (!used[j]) Q.push(make_pair(-A[j], j)); 
		while (q-- > 0) { 
			if (Q.empty() || -Q.top().fi < i) { now = -1e9; break; } 
			int t = Q.top().se; used[t] = 1, Q.pop(); 
			add(B[t], 1), add(A[t], -1), --now; 
		} 
	} 
	ans[N + 1] = -1e9; 
	while (M--) { 
		int a = gi(), b = gi(); 
		a = lower_bound(&C[1], &C[N + 1], a) - C; 
		b = lower_bound(&C[1], &C[N + 1], b) - C;
		int res = -1; 
		if (res < ans[a] + 1) res = ans[a] + 1; 
		if (res < ans[b]) res = ans[b]; 
		printf("%d\n", res); 
	} 
    return 0; 
} 