#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
    res = 0;T f = 1;char c = getchar();
    while(c < '0' || c > '9') {
	if(c == '-') f = -1;
	c = getchar();
    }
    while(c >= '0' && c <= '9') {
	res = res * 10 +c - '0';
	c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {x = -x;putchar('-');}
    if(x >= 10) {
	out(x / 10);
    }
    putchar('0' + x % 10);
}
int N,Q,pos;
int A[MAXN][2],C[MAXN],ans;
int val[MAXN * 4],tot;
int cnt[MAXN * 4],num[MAXN * 4],f[MAXN * 4],inx[MAXN * 4];
bool all_fail;
struct cmp1 {
    bool operator () (pii a,pii b) {
	if(a.fi != b.fi) return a.fi < b.fi;
	return a.se > b.se;
    }
};
struct cmp2 {
    bool operator () (pii a,pii b) {
	if(a.se != b.se) return a.se > b.se;
	return a.fi < b.fi;
    }
};
multiset<pii,cmp1> S1;
multiset<pii,cmp2> S2;
vector<int> v[MAXN * 4];
vector<pii > rec;
void Init() {
    read(N);
    for(int i = 1 ; i <= N ; ++i) {
	read(A[i][0]);read(A[i][1]);
	val[++tot] = A[i][0];
	val[++tot] = A[i][1];
    }
    for(int i = 1 ; i <= N + 1 ; ++i) {
	read(C[i]);
	val[++tot] = C[i];
    }
    sort(val + 1,val + tot + 1);
    tot = unique(val + 1,val + tot + 1) - val - 1;
    for(int i = 1 ; i <= N ; ++i) {
	int t = lower_bound(val + 1,val + tot + 1,A[i][0]) - val;
	cnt[t]++;
    }
    for(int i = 1 ; i <= N + 1 ; ++i) {
	int t = lower_bound(val + 1,val + tot + 1,C[i]) - val;
	cnt[t]--;
    }
    for(int i = 1 ; i <= tot ; ++i) {
	num[i] = cnt[i];
	cnt[i] += cnt[i - 1];
    }
    ans = N;
    for(int i = 1 ; i <= N ; ++i) {
	if(A[i][0] > A[i][1]) {
	    int s = lower_bound(val + 1,val + tot + 1,A[i][0]) - val;
	    int t = lower_bound(val + 1,val + tot + 1,A[i][1]) - val;
	    v[s - 1].pb(t);
	}
    }
    int pre = 0;
    memset(inx,0,sizeof(inx));
    for(int i = tot ; i >= 1 ; --i) {
	for(auto s : v[i]) S1.insert(mp(s,i));
	pre += inx[i];
	cnt[i] += pre;
	while(cnt[i] < -1 && S1.size() > 0) {
	    pii seg = *S1.begin();S1.erase(S1.begin());
	    if(seg.fi > i) {rec.pb(seg);continue;}
	    num[seg.fi]++;num[seg.se + 1]--;
	    inx[seg.fi - 1]--;
	    --ans;
	    cnt[i]++;++pre;
	}
	if(cnt[i] < -1) all_fail = 1;
    }
    for(int i = 1 ; i <= tot ; ++i) {
	num[i] += num[i - 1];
	v[i].clear();
    }
    for(auto t : S1) {
	rec.pb(t);
    }
    for(auto t : rec) {
	v[t.fi].pb(t.se);
    }
    memset(inx,0,sizeof(inx));
    pre = 0;
    for(int i = 1 ; i <= tot ; ++i) {
	for(auto t : v[i]) S2.insert(mp(i,t));
	pre += inx[i];
	num[i] += pre;
	if(num[i] == -1) {
	    if(S2.size() <= 0) {
		for(int j = i ; j <= tot ; ++j) f[j] = -1;
		break;
	    }
	    pii seg = *S2.begin();
	    if(seg.se < i) {
		for(int j = i ; j <= tot ; ++j) f[j] = -1;
		break;
	    }
	    inx[seg.se + 1]--;
	    ++pre;
	    f[i] = f[i - 1] + 1;
	}
	else f[i] = f[i - 1];
    }
    f[tot + 1] = -1;
}

void Solve() {
    int Q;
    read(Q);
    int d,e;
    for(int i = 1 ; i <= Q ; ++i) {
	read(d);read(e);
	if(all_fail) {puts("-1");continue;}
	int res = -1;
	int t = lower_bound(val + 1,val + tot + 1,d) - val - 1;
	if(val[t - 1] == d - 1) {
	    if(f[t - 1] != -1) res = max(ans - f[t - 1] + 1,res);
	}
	if(f[t] != -1) res = max(ans - f[t] + 1,res);
	t = lower_bound(val + 1,val + tot + 1,e) - val - 1;
	if(val[t - 1] == e - 1) {
	    if(f[t - 1] != -1) res = max(ans - f[t - 1],res);
	}
	if(f[t] != -1) res = max(ans - f[t],res);
	out(res);enter;
    }
    
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Init();
    Solve();
}
