#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<string>
#include<stack>
#include<cstdio>
#include<cmath>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int,int> P;
typedef pair<int,P> P1;

#define fr first
#define sc second
#define mp make_pair
#define pb push_back
#define rep(i,x) for(int i=0;i<x;i++)
#define rep1(i,x) for(int i=1;i<=x;i++)
#define rrep(i,x) for(int i=x-1;i>=0;i--)
#define rrep1(i,x) for(int i=x;i>0;i--)
#define sor(v) sort(v.begin(),v.end())
#define rev(s) reverse(s.begin(),s.end())
#define lb(vec,a) lower_bound(vec.begin(),vec.end(),a)
#define ub(vec,a) upper_bound(vec.begin(),vec.end(),a)
#define uniq(vec) vec.erase(unique(vec.begin(),vec.end()),vec.end())
#define mp1(a,b,c) P1(a,P(b,c))

const int INF=1000000000;
const int dir_4[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
const int dir_8[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};

int main(){
	static int n,a[100010],b[100010],c[100010];
	static int q,d[100010],e[100010];
	scanf("%d",&n);
	rep1(i,n)scanf("%d%d",&a[i],&b[i]);
	rep1(i,n+1)scanf("%d",&c[i]);
	scanf("%d",&q);
	rep1(i,q)scanf("%d%d",&d[i],&e[i]);
	sort(c+1,c+1+n+1);
	
	static multiset<int> s[100010];
	rep1(i,n){
		int _a = lower_bound(c+1,c+1+n+1,a[i])-c;
		int _b = lower_bound(c+1,c+1+n+1,b[i])-c;
		s[_a].insert(_b);
	}
	priority_queue<P,vector<P>,greater<P>> que;
	int score = n;
	int cnt = 0;
	static int pre[100010];
	rrep1(i,n+2){
		for(int t: s[i]){
			cnt ++;
			que.push(P(t,i));
		}
		/*cout << i << ":" << que.size() << " " ;
		if(que.size()>0)cout << que.top().fr << " " << que.top().sc << endl;
		else cout << endl;*/
		while(cnt > n+2-i){
			P p = que.top(); que.pop(); cnt --;
			if(p.fr >= i){
				rep(loop,q){
					cout << -1 << endl;
				}
				return 0;
			}
			s[p.sc].erase(s[p.sc].find(p.fr));
			s[p.fr].insert(p.sc);
			score --;
		}
		if(i == n+2)continue;
		/*if(cnt < n+2-i)pre[i] = i;
		else {
			pre[i] = que.top().fr;
			if(pre[i] >= i)pre[i] = -1;
		}*/
	}
	pre[n+3] = n+3;
	rrep1(i,n+2){
		pre[i] = pre[i+1];
		//cout << i << ":";
		for(int t: s[i]){
			//cout << t;
			pre[i] = min( pre[i] , t );
		}
		//cout << endl;
	}
	int CNT = 0;
	rrep1(i,n+2){
		CNT += s[i].size();
		if(i == n+2)continue;
		if(CNT < n+2-i)pre[i] = i;
		else if(pre[i] >= i)pre[i] = -1;
	}
	rep1(i,n+1){
		if(pre[i] == i && i > 1 && pre[i-1] != i-1){
			pre[i] = pre[i-1];
		}
	}
	/*cout << score << endl;
	rep1(i,n+2){
		cout << i << ":" << pre[i] << endl;
	}*/
	
	static int dp[100010];
	rep1(i,n+1){
		if(pre[i] == -1)dp[i] = -1;
		else if(pre[i] == i)dp[i] = score;
		else dp[i] = max(dp[pre[i]]-1,-1);
	}
	
	rep1(i,q){
		int _d = lower_bound(c+1,c+1+n+1,d[i])-c;
		int _e = lower_bound(c+1,c+1+n+1,e[i])-c;
		
		int ret = -1;
		if(_d != n+2 && dp[_d] != -1)ret = max( ret , dp[_d]+1 );
		if(_e != n+2 && dp[_e] != -1)ret = max( ret , dp[_e] );
		cout << ret << endl;
		continue;
		
		//cerr << "_d=" << _d << "_e=" << _e << endl;
		if(_d == n+2 && _e == n+2){
//cerr << __LINE__ << endl;
			cout << -1 << endl;
			continue;
		}
		if(_d <= _e){
//cerr << __LINE__ << endl;
			if(pre[_d] == -1)cout << -1 << endl;
			else cout << dp[_d]+1 << endl;
		}
		else {
			if(_d == n+2){
//cerr << __LINE__ << endl;
				cout << dp[_e] << endl;
				continue;
			}
			if(pre[_d] == -1){
//cerr << __LINE__ << endl;
				if(pre[_e] == -1)cout << -1 << endl;
				else cout << dp[_e] << endl;
			}
			else if(pre[_d] == _d){
//cerr << __LINE__ << endl;
				cout << dp[_d]+1 << endl;
			}
			else {
				if(pre[_d] <= _e){
//cerr << __LINE__ << endl;
					if(dp[_d] == -1)cout << -1 << endl;
					else cout << dp[_d]+1 << endl;
				}
				else {
//cerr << __LINE__ << endl;
					cout << dp[_e] << endl;
				}
			}
		}
	}
}

Measured memory_bytes: 13812