#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
struct Seg{
int n,t;
pair<int,int>bad;
vector<pair<int,int>>tree;
pair<int,int> comp(pair<int,int>a,pair<int,int>b){
if(t)return max(a,b);
return min(a,b);
}
void init(int N,int T){
n=N;
t=T;
if(t)bad={0,0};
else bad={n+1,n+1};
tree.clear();
tree.resize(n<<2,bad);
}
int l,r;
void up(int node=1,int left=1,int right=-1){
if(right==-1)right=n;
if(left==right){
tree[node]={r,left};
return;
}
if(l>mid)up(node*2+1,mid+1,right);
else up(node*2,left,mid);
tree[node]=comp(tree[node*2],tree[node*2+1]);
}
void update(int tar,int x){
l=tar;r=x;
up();
}
pair<int,int> qu(int node=1,int left=1,int right=-1){
if(right==-1)right=n;
if(left>=l&&right<=r)return tree[node];
if(left>r||right<l)return bad;
return comp(qu(node*2,left,mid),qu(node*2+1,mid+1,right));
}
pair<int,int> query(int left,int right){
l=left;r=right;
if(l>r)return bad;
return qu();
}
};
int n;
pair<int,int>ara[200023];
int a[200023],b[200023];
Seg mn,mx;
vector<int>v[200023];
int ans[200023];
signed main(){
ios_base::sync_with_stdio(23^23);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>ara[i].fr>>ara[i].sc;
}
mn.init(n,0);mx.init(n,1);
for(int i=1;i<=n;i++){
a[i]=n+1;
if(ara[i].fr==1){
a[i]=0;
v[a[i]].pb(i);
}
mn.update(i,ara[i].fr);
mx.update(i,ara[i].sc);
}
for(int i=0;i<n;i++){
while(v[i].size()){
int pos=v[i].back();
v[i].pop_back();
if(a[pos]!=i)continue;
while(true){
pair<int,int>p=mx.query(1,pos-1);
if(p.fr<pos)break;
if(a[p.sc]>a[pos]+1){
a[p.sc]=a[pos]+1;
v[a[p.sc]].pb(p.sc);
}
mx.update(p.sc,0);
}
while(true){
pair<int,int>p=mn.query(pos+1,n);
if(p.fr>pos)break;
if(a[p.sc]>a[pos]+1){
a[p.sc]=a[pos]+1;
v[a[p.sc]].pb(p.sc);
}
mn.update(p.sc,n+1);
}
}
}
mn.init(n,0);mx.init(n,1);
for(int i=1;i<=n;i++){
b[i]=n+1;
if(ara[i].sc==n){
b[i]=0;
v[b[i]].pb(i);
}
mn.update(i,ara[i].fr);
mx.update(i,ara[i].sc);
}
for(int i=0;i<n;i++){
while(v[i].size()){
int pos=v[i].back();
v[i].pop_back();
if(b[pos]!=i)continue;
while(true){
pair<int,int>p=mx.query(1,pos-1);
if(p.fr<pos)break;
if(b[p.sc]>b[pos]+1){
b[p.sc]=b[pos]+1;
v[b[p.sc]].pb(p.sc);
}
mx.update(p.sc,0);
}
while(true){
pair<int,int>p=mn.query(pos+1,n);
if(p.fr>pos)break;
if(b[p.sc]>b[pos]+1){
b[p.sc]=b[pos]+1;
v[b[p.sc]].pb(p.sc);
}
mn.update(p.sc,n+1);
}
}
}
mn.init(n,0);mx.init(n,1);
for(int i=1;i<=n;i++){
mn.update(i,ara[i].fr);
mx.update(i,ara[i].sc);
ans[i]=a[i]+b[i]+1;
if(ans[i]>n)continue;
v[ans[i]].pb(i);
}
for(int i=1;i<=n;i++){
while(v[i].size()){
int pos=v[i].back();
v[i].pop_back();
if(ans[pos]!=i)continue;
while(true){
pair<int,int>p=mx.query(1,pos-1);
if(p.fr<pos)break;
if(ans[p.sc]>ans[pos]+1){
ans[p.sc]=ans[pos]+1;
v[ans[p.sc]].pb(p.sc);
}
mx.update(p.sc,0);
}
while(true){
pair<int,int>p=mn.query(pos+1,n);
if(p.fr>pos)break;
if(ans[p.sc]>ans[pos]+1){
ans[p.sc]=ans[pos]+1;
v[ans[p.sc]].pb(p.sc);
}
mn.update(p.sc,n+1);
}
}
}
for(int i=1;i<=n;i++){
if(ans[i]>n)ans[i]=-1;
}
int q;cin>>q;
while(q--){
int x;cin>>x;
cout<<ans[x]<<endl;
}
}