#include<bits/stdc++.h>
#define int long long
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
inline int read()
{
int x=0,f=1;
char ch=nc();
while(ch<48||ch>57)
{
if(ch=='-')
f=-1;
ch=nc();
}
while(ch>=48&&ch<=57)
x=x*10+ch-48,ch=nc();
return x*f;
}
struct node{
int id,dis;
node(int a,int b){
id=a,dis=b;
}
bool operator < (const node &u) const {return dis>u.dis;}
};
const int N=3e6+9,maxx=1e6+9;
int n,m;
int a[N];
int b[N];
long long sum=0;
int c[N],d[N],last[N],l[N],r[N];
long long ans[N];
int cnt;int pri[N],val[N];int root=0;int siz[N],ls[N],rs[N],ne[N];
int New(int vall)
{
pri[++cnt]=rand();
ne[cnt]=vall+maxx;
val[cnt]=vall;
last[cnt]=ne[cnt];
siz[cnt]=1;
return cnt;
}
void push_up(int u)
{
siz[u]=siz[ls[u]]+siz[rs[u]]+1;
}
void spolit(int u,int x,int &L,int &R)
{
if(u==0)
{
L=R=0;
return ;
}
if(siz[ls[u]]+1<=x)
{
L=u;
spolit(rs[u],x-siz[ls[u]]-1,rs[u],R);
}
else
{
R=u;
spolit(ls[u],x,L,ls[u]);
}
push_up(u);
}
int merge(int L,int R)
{
if(L==0 || R==0) return L+R;
if(pri[L]>pri[R])
{
rs[L]=merge(rs[L],R);
push_up(L);
return L;
}
else
{
ls[R]=merge(L,ls[R]);
push_up(R);
return R;
}
}
int num=0;
void print(int u)
{
if(u==0) return ;
print(ls[u]);
num++;
if(val[u]!=0)
{
for(int i=ne[u];i;i=ne[i])
{
ans[i-maxx]=num;
}
}
print(rs[u]);
}
signed main()
{
n=read();
for(int i=1;i<=500003;i++)
root=merge(root,New(i));
for(int i=1;i<=n;i++)
{
int l=read(),r=read();
int L,Mid1,Mid2,Mid3,R;
spolit(root,l-1,L,R);
spolit(R,r-l+2,Mid1,R);
spolit(Mid1,r-l+1,Mid1,Mid3);
spolit(Mid1,r-l,Mid1,Mid2);
if(val[Mid3]!=0)
{
ne[last[Mid2]]=ne[Mid3];
last[Mid2]=last[Mid3];
}
root=merge(L,merge(New(0),merge(merge(Mid1,Mid2),R)));
}
print(root);
m=read();
while(m--)
{
int pos=read();
cout<<ans[pos]<<endl;
}
return 0;
}