#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
struct Node{
int l,r,d;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int N;
cin >> N;
vector<int> L(N),R(N);
for(int i=0;i<N;i++){
cin >> L[i] >> R[i];
L[i]--,R[i]--;
}
int Q;
cin >> Q;
vector<int> X(Q);
for(int i=0;i<Q;i++){
cin >> X[i];
X[i]--;
}
int len=1;
while(len<N)
len*=2;
vector<pair<int,int>> adj[len*2+3];
//for(int i=2;i<2*len;i++){
//adj[i].push_back(make_pair(i/2,0));
//adj[i*2+1].push_back(make_pair(i,0));
//}
for(int i=0;i<N;i++){
int l=L[i]+len,r=R[i]+len;
while(l<=r){
if(l%2==1)
adj[l++].push_back(make_pair(i,1));
if(r%2==0)
adj[r--].push_back(make_pair(i,1));
l/=2,r/=2;
}
}
auto calc = [&](vector<pair<int,int>> dep){
priority_queue<pair<int,int>
,vector<pair<int,int>>,greater<>> pq;//dist,node
vector<int> dist(N+1,1e9);
for(auto [d,node] : dep){
pq.push(make_pair(d,node));
dist[node]=d;
}
vector<int> vis(2*len,0);
vector<int> used(2*len+3,0);
while(!pq.empty()){
auto [d,node] = pq.top();
pq.pop();
if(vis[node]){
continue;
}
vis[node]=true;
int u = node+len;
while(u>=1 && !used[u]){
used[u]=true;
for(auto [v,w] : adj[u]){
if(d+w<dist[v]){
dist[v]=d+w;
pq.push({d+w,v});
}
}
u/=2;
}
}
return dist;
};
vector<pair<int,int>> deps{{0,0}};
vector<int> d1=calc(deps);
d1[0]=1;
deps={{0,N-1}};
vector<int> dn=calc(deps);
dn[N-1]=1;
deps.clear();
for(int i=0;i<N;i++){
if(d1[i]+dn[i]<1e9)
deps.push_back(make_pair(d1[i]+dn[i],i));
}
vector<int> dist=calc(deps);
for(int i=0;i<Q;i++){
if(dist[X[i]]<1e9)
cout << dist[X[i]]-(X[i]!=0&&X[i]!=N-1) << endl;
else
cout << -1 << endl;
}
}