#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n,m,ct;
int head[maxn],dep[maxn],siz[maxn],son[maxn],lg[maxn],cnt[maxn],ans[maxn];
int fa[maxn][20];
vector<pair<int,int> >q[maxn];
struct node{
int v,nxt;
}e[maxn<<1];
inline void cal(){
lg[1]=0;
for(int i=2;i<=100000;i++)lg[i]=lg[i/2]+1;
}
inline void add(int u,int v){
e[++ct].v=v;
e[ct].nxt=head[u];
head[u]=ct;
}
inline void ipt(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int u;
scanf("%d",&u);
add(u,i);
}
}
inline void dfs1(int u,int f){
siz[u]=1;
son[u]=0;
fa[u][0]=f;
for(int i=1;i<=lg[dep[u]];i++)fa[u][i]=fa[fa[u][i-1]][i-1];
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
dep[v]=dep[u]+1;
dfs1(v,u);
siz[v]+=siz[u];
if(siz[v]>siz[son[u]])son[u]=v;
}
}
inline int find(int u,int k){
if(k>dep[u])return 0;
for(int i=0;i<=20;i++){
if(k&(1<<i))u=fa[u][i];
}
return u;
}
inline void init(){
scanf("%d",&m);
for(int i=1;i<=m;i++){
int v,p;
scanf("%d%d",&v,&p);
v=find(v,p);
q[v].push_back(make_pair(i,p));
}
}
inline void modify(int u,int flag){
cnt[dep[u]]+=flag;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
modify(v,flag);
}
}
inline void dfs2(int u){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==son[u])continue;
dfs2(v);
modify(v,-1);
}
if(son[u])dfs2(son[u]);
cnt[dep[u]]++;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==son[u])continue;
modify(v,1);
}
for(int i=0;i<q[u].size();i++){
int k=q[u][i].second;
int op=q[u][i].first;
if(u!=0)ans[op]=cnt[dep[u]+k]-1;
else ans[op]=0;
}
}
inline void output(){
for(int i=1;i<=m;i++)printf("%d ",ans[i]);
printf("\n");
}
signed main(){
cal();
ipt();
dfs1(0,0);
init();
dfs2(0);
output();
return 0;
}