#include <bits/stdc++.h>
using namespace std;

#define FOR(i,a,b) for(int i = (a); i < (b); i++)
#define RFOR(i,b,a) for(int i = (b) - 1; i >= (a); i--)
#define ITER(it, a) for(typeof(a.begin()) it = a.begin(); it != a.end(); it++)
#define FILL(a, value) memset(a, value, sizeof(a))

#define SZ(a) (int) a.size()
#define ALL(a) a.begin(),a.end()
#define PB push_back
#define MP make_pair

typedef long long LL;
typedef vector<int> VI;
typedef pair<int, int> PII;

const double PI = acos(-1.0);
const LL INF = 1000 * 1000 * 1000 + 7;
const LL LINF = INF * (LL)INF;

const int MAX = 100100;

int A[MAX];
int B[MAX];
int C[MAX];
int S[MAX];

VI L[MAX];
VI R[MAX];

int SUB[MAX];
int ADD[MAX];

int RES[MAX];

multiset<PII> USD;

void norm(PII& a)
{
	a.first = abs(a.first);
	a.second = abs(a.second);
	if (a.first > a.second) swap(a.first, a.second);
}

void _ADD(PII a)
{
	norm(a);
	USD.insert(a);
}

bool HAS(PII a)
{
	norm(a);
	if (USD.find(a) == USD.end()) return false;
	return true;
}

void REMOVE(PII a)
{
	norm(a);
	USD.erase(USD.find(a));
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//ios::sync_with_stdio(false); cin.tie(0);

	int n;
	scanf("%d", &n);
	FOR (i, 0, n)
	{
		scanf("%d%d", &A[i], &B[i]);
	}

	n++;

	FOR (i, 0, n)
	{
		scanf("%d", &C[i]);
	}

	sort(C, C+n);

	FOR (i, 0, n)
	{
		S[i] = -1;
	}

	FOR (i, 0, n-1)
	{
		int x = A[i];
		int y = B[i];

		x = lower_bound(C, C+n, x) - C;
		y = lower_bound(C, C+n, y) - C;

//		cout<<"@@ "<<x<<' '<<y<<endl;

		S[x]++;
		if (y < x)
		{
			R[x-1].PB(y);
			L[y].PB(x-1);
		}
	}

	FOR (i, 1, n)
	{
		S[i] += S[i-1];
	}

	int cnt = 0;
	multiset<PII> T;

//	FOR (i, 0, n)
//	{
//		cout<<S[i]<<' ';
//	}
//	cout<<endl;

	int add = 0;

	RFOR(i, n, 0)
	{
		FOR (j, 0, SZ(R[i]))
		{
			T.insert(MP(R[i][j], i));
		}

		S[i] += add;
		add -= SUB[i];

		while (S[i] < -1)
		{
//			cout<<"!! "<<i<<endl;
			if (T.empty())
			{
				cnt = INF;
				break;
			}
			PII a = *T.begin();
			T.erase(T.begin());

			int x = a.first;
			int y = a.second;
//			cout<<x<<' '<<y<<endl;

			_ADD(MP(x, y));

			if (x > i)
			{
				cnt = INF;
				break;
			}

			S[i]++;
			if (x != i) add++;
			if (x != i) SUB[x]++;

			ADD[i+1]++;
			ADD[y+1]--;

			cnt++;
		}

		if (cnt == INF) break;
	}

//	cout<<"==> "<<cnt<<endl;
/*
	FOR (i, 0, n)
	{
		S[i] += ADD[i];
		ADD[i+1] += ADD[i];
		ADD[i] = 0;
		cout<<S[i]<<' ';
	}
	cout<<endl;
*/
	T.clear();

	if (cnt == INF)
	{
		FOR (i, 0, n)
		{
			RES[i] = INF;
		}
	}
	else

	FOR (i, 0, n)
	{

		RES[i] = cnt;
		FOR (j, 0, SZ(L[i]))
		{
			T.insert(MP(-L[i][j], i));
		}
		S[i] += ADD[i];
		ADD[i+1] += ADD[i];

		if (S[i] < -1) throw -1;

		if (S[i] == -1)
		{
//			cout<<"!! "<<i<<endl;
			while(SZ(T) && HAS(*T.begin()))
			{
				REMOVE(*T.begin());
				T.erase(T.begin());
			}

			if (SZ(T) == 0 || -(*T.begin()).first < i)
			{
				FOR (j, i + 1, n)
				{
					RES[j] = INF;
				}
				break;
			}

			int x = -(*T.begin()).first;
//			cout<<x<<endl;
			T.erase(T.begin());

			S[i]++;
			ADD[i+1]++;
			ADD[x+1]--;

			cnt++;
		}

	}

//	FOR (i, 0, n)
//	{
//		cout<<RES[i]<<' ';
//	}
//	cout<<endl;

	RES[n] = INF;

	int q;
	scanf("%d", &q);
	FOR (i, 0, q)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		x = lower_bound(C, C+n, x) - C;
		y = lower_bound(C, C+n, y) - C;

//		cout<<"!!!!! "<<x<<' '<<y<<endl;

		int res = min(RES[x], RES[y] + 1);
		res = n - res;
		if (res < 0) res = -1;
		printf("%d\n", res);
	}


}


Measured memory_bytes: 18816