#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define pll pair<LL,LL>
#define x first
#define y second
#define pi acosl(-1)
#define sqr(x) ((x)*(x))
#define pdd pair<double,double>
#define MEMS(x) memset(x,-1,sizeof(x))
#define MEM(x) memset(x,0,sizeof(x))
#define less Less
#define EPS 1e-4
#define arg ARG
#define cpdd const pdd
#define rank Rank
#define MXN 200005

struct node{
    node *l,*r;
    int a,b;
    int Min;
    int tag;
    node(int _a,int _b):a(_a),b(_b),l(NULL),r(NULL),tag(0),Min(0){

    }
}*root;
void push(node *n){
    n->l->tag+=n->tag;
    n->r->tag+=n->tag;
    n->tag=0;
}
int Min(node *n){
    return n->Min+n->tag;
}
void pull(node *n){
    n->Min=min(Min(n->l),Min(n->r));
}
void add(node *n,int l,int r,int k){
    if(n->a>=l&&n->b<=r){
        n->tag+=k;
        return ;
    }
    if(n->b<l||n->a>r)return ;
    push(n);
    add(n->l,l,r,k);
    add(n->r,l,r,k);
    pull(n);
}
int query(node *n,int k){
    if(n->a==n->b)return Min(n);
    int mid=(n->a+n->b)/2;
    push(n);
    if(k<=mid){
        return query(n->l,k);
    }
    else{
        return query(n->r,k);
    }
}
void build(node *n){
    if(n->a==n->b)return ;
    int mid=(n->a+n->b)/2;
    n->l=new node(n->a,mid);
    n->r=new node(mid+1,n->b);
    build(n->l);
    build(n->r);
}
int main(){ 
    map<int,int> index;
    int now=0;
    int n;
    scanf("%d",&n);
    pii p[100005];
    for(int i = 0;i<n;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        p[i]=mp(x,y);
        index[x];
        index[y];
    }
    multiset<int> s;
    for(int i =0;i<=n;i++){
        int x;
        scanf("%d",&x);
        s.insert(x);
        index[x];
    }
    int q;
    scanf("%d",&q);
    pii que[100005];
    for(int i = 0;i<q;i++){
        int x,y;
        scanf("%d %d",&x,&y);
        que[i]=mp(x,y);
        index[x];
        index[y];
    }
    for(auto &it:index){
        it.y=++now;
    }
    root = new node(1,now);
    build(root);
    vector<pii> v1;
    int ans=0;
    for(int i = 0;i<n;i++){
        if(p[i].x<=p[i].y){
            auto it=s.lower_bound(p[i].x);
            if(it==s.end()){
                for(int i = 0;i<q;i++){
                    printf("-1\n");
                }
                return 0;
            }
            s.erase(it);
            //ans++;
        }
        else{
            v1.pb(mp(index[p[i].x]-1,index[p[i].y]));
            add(root,index[p[i].x],now,1);
        }
    }
    for(auto it:s){
        add(root,index[it],now,-1);
    }
    sort(v1.begin(),v1.end());
   // reverse(v1.begin(),v1.end());
    //vector<pii> tmp;
    ans=n;
    priority_queue<pii,vector<pii>,greater<pii> > pq;
    pq.push(mp(1e9,1e9));
   // for(int i = 1;i<=now;i++)printf("%d ",query(root,i));
   // printf("\n");
    for(int i = now;i>=1;i--){
        while(!v1.empty()&&v1.back().x==i){
         //   printf("%d %d\n",v1.back().y,v1.back().x);
            pq.push(mp(v1.back().y,v1.back().x));
            v1.pop_back();
        }
        while(query(root,i)<-1){
            pii p=pq.top();
            if(p.x>i){
                for(int i = 0;i<q;i++){
                    printf("-1\n");
                }
                return 0;
            }
            pq.pop();
            add(root,p.x,p.y,1);
            ans--;
        }
    }


    vector<pii> tmp2;
    while(!pq.empty()){
        tmp2.pb(pq.top());
        pq.pop();
    }
    sort(tmp2.begin(),tmp2.end());
    int res[500005];
    res[0]=ans;
    priority_queue<pii> pq2;
    int nowt=0;
    for(int i= 1;i<=now;i++){
        res[i]=ans;
      //  printf("%d ",res[i]);
        while(nowt!=tmp2.size()&&tmp2[nowt].x==i){
            pq2.push(mp(tmp2[nowt].y,tmp2[nowt].x));
            nowt++;
        }
        if(query(root,i)==-1){
            if(pq2.empty()||pq2.top().x<i){
                ans=-1e9;
            }
            else{
                pii p=pq2.top();
                pq2.pop();
                add(root,p.y,p.x,1);
                ans--;
              //  printf("%d %d\n",p.x,p.y);
            }
        }
    }
   // printf("\n");
    for(int i = 0;i<q;i++){
        int Max=max(res[index[que[i].x]]+1,res[index[que[i].y]]);
        if(Max<0)Max=-1;
        printf("%d\n",Max);
    }
}
/**/

Measured memory_bytes: 82424