#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#include<cmath>
#include<string>
#define ls (t<<1)
#define rs ((t<<1)+1)
#define mid ((l+r)>>1)
#define fi first
#define se second
#define mk make_pair
#define pb push_back
#define N 100005
#define M 500005
#define seed 23333
using namespace std;
set<pair<int,int> >st;
multiset<int>str;
vector<pair<int,int> >v[M];
vector<int>alb[M];
int i,j,m,n,p,k,C[N],A[N],B[N],D[M],Ans,F[M],f[M],vis[N],X[N],Y[N],Q;
int ans[M];
void RE()
{
for (i=1;i<=Q;++i) puts("-1");
exit(0);
}
int main()
{
scanf("%d",&n); Ans=n;
for (i=1;i<=n;++i) scanf("%d%d",&A[i],&B[i]),D[++D[0]]=A[i],D[++D[0]]=B[i];
for (i=0;i<=n;++i) scanf("%d",&C[i]),D[++D[0]]=C[i];
scanf("%d",&Q);
for (i=1;i<=Q;++i) scanf("%d%d",&X[i],&Y[i]),D[++D[0]]=X[i],D[++D[0]]=Y[i];
sort(D+1,D+D[0]+1);
D[0]=unique(D+1,D+D[0]+1)-(D+1);
for (i=1;i<=n;++i) A[i]=lower_bound(D+1,D+D[0]+1,A[i])-D,B[i]=lower_bound(D+1,D+D[0]+1,B[i])-D;
for (i=0;i<=n;++i) f[lower_bound(D+1,D+D[0]+1,C[i])-D]++;
for (i=1;i<=n;++i) f[A[i]]--;
for (i=D[0];i;--i) f[i]+=f[i+1];
for (i=1;i<=n;++i) if (A[i]>B[i]) v[A[i]].pb(mk(B[i]+1,i));
int now=0;
for (i=D[0];i;--i)
{
for (j=0;j<(int)v[i].size();++j) st.insert(v[i][j]);
f[i]+=now;
while (f[i]<0)
{
if (!st.size()) RE();
pair<int,int> x=*st.begin();
if (x.fi>i) RE();
F[x.fi]++;
vis[x.se]=1;
f[i]++; now++; --Ans;
st.erase(st.begin());
}
now-=F[i];
}
memset(ans,-1,sizeof(ans)); ans[0]=Ans;
for (i=1;i<=n;++i) if (!vis[i]&&A[i]>B[i]) alb[B[i]+1].pb(A[i]);
now=0;
memset(f,0,sizeof(f));
memset(F,0,sizeof(F));
for (i=0;i<=n;++i) f[lower_bound(D+1,D+D[0]+1,C[i])-D]++;
for (i=1;i<=n;++i) if (!vis[i]) f[A[i]]--; else f[B[i]]--;
for (i=D[0];i;--i) f[i]+=f[i+1];
for (i=1;i<=D[0];++i)
{
for (j=0;j<(int)alb[i].size();++j) str.insert(alb[i][j]);
f[i]+=now;
if (f[i]<=0)
{
if (!str.size()) break;
int x=*--str.end();
if (x<i) break;
ans[i]=ans[i-1]-1; f[i]++; now++; F[x]++;
str.erase(str.find(x));
}
else ans[i]=ans[i-1];
now-=F[i];
}
for (i=1;i<=Q;++i)
{
X[i]=lower_bound(D+1,D+D[0]+1,X[i])-D;
Y[i]=lower_bound(D+1,D+D[0]+1,Y[i])-D;
if (ans[X[i]]==-1&&ans[Y[i]]==-1) puts("-1");
else if (ans[X[i]]==-1) printf("%d\n",ans[Y[i]]);
else if (ans[Y[i]]==-1) printf("%d\n",ans[X[i]]+1);
else printf("%d\n",max(ans[X[i]]+1,ans[Y[i]]));
}
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:38:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&n); Ans=n;
^
./Main.cpp:39:77: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for (i=1;i<=n;++i) scanf("%d%d",&A[i],&B[i]),D[++D[0]]=A[i],D[++D[0]]=B[i];
^
./Main.cpp:40:54: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
for (i=0;i<=n;++i) scanf("%d",&C[i]),D[++D[0]]=C[i];
^
./Main.cpp:41:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&Q);
^
./Main.cpp:42:77: warning: ignoring return value of ‘...