#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
const int N=200005;
pii f[N],A[N];
int flag[N],l,n,a[N],b[N],c[N],tot,x,y,Ans[N],Q;
struct Tree{
	int l,r,num,flag;
}T[N*4];
int cmp(pii x,pii y){
	return x.se>y.se;
}
void build(int x,int l,int r){
	T[x].l=l;T[x].r=r;
	if (l==r)return;
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
}
void down(int x){
	T[x*2].num+=T[x].flag;
	T[x*2+1].num+=T[x].flag;
	T[x*2].flag+=T[x].flag;
	T[x*2+1].flag+=T[x].flag;
	T[x].flag=0;
}
void insert(int x,int l,int r,int z){
	if (T[x].l>r||l>T[x].r)return;
	if (T[x].l>=l&&T[x].r<=r){
		T[x].num+=z;
		T[x].flag+=z;
		return;
	}
	down(x);
	insert(x*2,l,r,z);
	insert(x*2+1,l,r,z);
}
int find(int x,int y){
	if (T[x].l==T[x].r)return T[x].num;
	down(x);
	int mid=(T[x].l+T[x].r)/2;
	if (y<=mid)return find(x*2,y);
	return find(x*2+1,y);
}
int ef(int x){
	if (x<=c[0])return 0;
	int l=0,r=n;
	while (l<r){
		int mid=(l+r+1)/2;
		if (c[mid]<x)l=mid;
		else r=mid-1;
	}
	return l+1;
}
void up(int x){
	if (x==1)return;
	if (f[x]<f[x/2]){
		swap(f[x],f[x/2]);
		up(x/2);
	}
}
void down2(int x){
	int i=x;
	if (x*2<=l&&f[x*2]<f[x])i=x*2;
	if (x*2<l&&f[x*2+1]<f[i])i=x*2+1;
	if (i!=x){
		swap(f[x],f[i]);
		down2(i);
	}
}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);
	for (int i=0;i<=n;i++)scanf("%d",&c[i]);
	sort(c,c+n+1);
	for (int i=1;i<=n;i++)a[i]=ef(a[i]),b[i]=ef(b[i]);
	build(1,0,n);
	for (int i=0;i<=n;i++)insert(1,i,n,-1);
	for (int i=1;i<=n;i++)insert(1,a[i],n,1);
	for (int i=1;i<=n;i++)
		if (b[i]<a[i])A[++tot]=mp(b[i],a[i]-1);
	sort(A+1,A+tot+1,cmp);
	int Flag=1,ans=n;
	for (int i=n,j=1;i>=0;i--){
		while (j<=tot&&A[j].se>=i){
			f[++l]=mp(A[j].fi,j);
			up(l);
			j++;
		}
		while (find(1,i)<-1){
			if (!l){
				Flag=0;
				break;
			}
			insert(1,A[f[1].se].fi,A[f[1].se].se,1);
			flag[f[1].se]=1;
			f[1]=f[l--];down2(1);ans--;
		}
	}
	int num=0;
	for (int i=1;i<=tot;i++)
		if (!flag[i])A[++num]=A[i];
	sort(A+1,A+num+1);
	int Max=-1;
	if (Flag)Ans[0]=ans;
	else Ans[0]=-1e9;
	for (int i=0,j=1;i<=n;i++){
		while (j<=num&&A[j].fi<=i)Max=max(A[j].se,Max),j++;
		if (find(1,i)==-1){
			if (Max<i)Flag=0;
			else {
				ans--;
				insert(1,i,Max,1);
				Max=-1;
			}
		}
		if (Flag)Ans[i+1]=ans;
		else Ans[i+1]=-1e9;
	}
	scanf("%d",&Q);
	while (Q--){
		scanf("%d%d",&x,&y);
		int ans=-1;
		x=ef(x);y=ef(y);
		ans=max(ans,Ans[x]+1);
		ans=max(ans,Ans[y]);
		printf("%d\n",ans);
	}
	return 0;
}
