#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+1];
for(int i=2;i<len;i++){
adj[i*2].push_back(make_pair(i,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+len,1));
if(r%2==0)
adj[r--].push_back(make_pair(i+len,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
for(auto [d,node] : dep){
pq.push(make_pair(d,len+node));
}
vector<int> vis(2*len,0);
vector<int> dist(2*len,1e9);
while(!pq.empty()){
auto [d,node] = pq.top();
pq.pop();
dist[node]=min(d,dist[node]);
if(vis[node]){
continue;
}
vis[node]=true;
for(auto [u,w] : adj[node]){
pq.push({d+w,u});
}
}
return dist;
};
vector<pair<int,int>> deps{{0,0}};
vector<int> d1=calc(deps);
deps={{0,N-1}};
vector<int> dn=calc(deps);
deps.clear();
for(int i=0;i<N;i++){
deps.push_back(make_pair(d1[len+i]+dn[len+i],i));
}
vector<int> dist=calc(deps);
for(int i=0;i<Q;i++){
if(dist[len+X[i]]!=1e9)
cout << dist[len+X[i]] << endl;
else
cout << -1 << endl;
}
}