#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline LL read()
{
	LL f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int stack[20];
template<typename T>inline void write(T x)
{
	if(x<0){putchar('-');x=-x;}
    if(!x){putchar('0');return;}
    int top=0;
    while(x)stack[++top]=x%10,x/=10;
    while(top)putchar(stack[top--]+'0');
}
template<typename T>inline void pr1(T x){write(x);putchar(' ');}
template<typename T>inline void pr2(T x){write(x);putchar('\n');}
const int MAXN=100005;
int a[MAXN],b[MAXN],c[MAXN],ps[MAXN],n,m;
int cal[MAXN],num[MAXN],pres[MAXN];
void gg(){int m=read();for(int i=1;i<=m;i++)pr2(-1);exit(0);}
struct node1
{
	int x,y,i;
	node1(){}node1(int _x,int _y,int _i){x=_x;y=_y;i=_i;}
	friend bool operator <(node1 n1,node1 n2)
	{
		if(n1.x!=n2.x)return n1.x<n2.x;
		return n1.y>n2.y;
	}
};
struct node2
{
	int x,y,i;
	node2(){}node2(int _x,int _y,int _i){x=_x;y=_y;i=_i;}
	friend bool operator <(node2 n1,node2 n2)
	{
		if(n1.x!=n2.x)return n1.x>n2.x;
		return n1.y<n2.y;
	}
};
vector<node1> vec[MAXN];
vector<node2> vec1[MAXN];
bool ok[MAXN];
priority_queue<node1> hp1;
priority_queue<node2> hp2;
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)a[i]=read(),b[i]=read();
	for(int i=1;i<=n+1;i++)c[i]=read();sort(c+1,c+1+n+1);c[n+2]=999999999;
	for(int i=1;i<=n;i++)
	{
		int u=lower_bound(c+1,c+1+n+2,a[i])-c;a[i]=n+1-u+1;
		u=lower_bound(c+1,c+1+n+2,b[i])-c;b[i]=n+1-u+1;
	}
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i])cal[a[i]]--,++cnt;
		else if(b[i])cal[b[i]]--;
		else gg();
	}
	for(int i=1;i<=n;i++)if(a[i])vec[a[i]].push_back(node1(b[i],a[i],i));
	for(int i=1;i<=n+1;i++)cal[i]+=cal[i-1]+1;
	for(int i=1,sum=0;i<=n+1;i++)
	{
		sum+=pres[i];cal[i]+=sum;
		for(int j=0;j<vec[i].size();j++)hp1.push(vec[i][j]);
		while(cal[i]<0)
		{
			if(hp1.empty())gg();
			int x=hp1.top().i;hp1.pop();
			if(b[x]<=i)gg();ok[x]=1;
			pres[b[x]]--;cal[i]++;sum++;cnt--;
			pres[i-1]++;pres[a[x]-1]--;
		}pres[i]=0;
	}
	for(int i=n+1,sum=0;i>=1;i--)sum+=pres[i],cal[i]+=sum;memset(pres,0,sizeof(pres));
	for(int i=1;i<=n;i++)if(a[i]&&!ok[i])vec1[b[i]-1].push_back(node2(a[i],b[i],i));
	memset(num,-1,sizeof(num));
	for(int i=n+1,sum=0;i>=1;i--)
	{
		sum+=pres[i];cal[i]+=sum;
		for(int j=0;j<vec1[i].size();j++)hp2.push(vec1[i][j]);
		while(cal[i]<=0)
		{
			if(hp2.empty())break;
			int x=hp2.top().i;hp2.pop();
			if(a[x]>i)break;
			pres[a[x]-1]--;sum++;cnt--;cal[i]++;
		}if(cal[i]<=0)break;
		num[i]=cnt;
	}
	int m=read();while(m--)
	{
		int x=read(),y=read();
		x=lower_bound(c+1,c+1+(n+2),x)-c;x=n+1-x+1;
		y=lower_bound(c+1,c+1+(n+2),y)-c;y=n+1-y+1;
		if(x==0&&y==0){pr2(-1);continue;}
		int ans1=-1,ans2=-1;
		if(num[x]!=-1)ans1=num[x]+1;
		if(num[y]!=-1)ans2=num[y];
		if(ans1==-1&&ans2==-1)pr2(-1);
		else if(ans1==-1)pr2(ans2);
		else if(ans2==-1)pr2(ans1);
		else pr2(max(ans1,ans2));
	}
	return 0;
}


Measured memory_bytes: 16244