#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct Q{
int l,r,pos,x,id;
}q[N];
struct node{
int to,next;
}e[N];
int h[N],cnt;
int n,m,f[N];
int lg[N],ff[N][25];
int dep[N],dfn[N],Max[N],tot;
int block;
int l,r,sum[N],ans[N];
bool cmp(Q a,Q b){
if(a.pos!=b.pos)
return a.l<b.l;
if(a.pos&1)return a.r<b.r;
return a.r>b.r;
}
void Link(int u,int v){
e[++cnt].to=v;
e[cnt].next=h[u];
h[u]=cnt;
}
void dfs(int x,int fa){
dep[x]=dep[fa]+1;
dfn[x]=++tot;
Max[x]=tot;
ff[x][0]=fa;
for(int i=1;i<=lg[dep[x]];i++)
ff[x][i]=ff[ff[x][i-1]][i-1];
for(int i=h[x];i;i=e[i].next){
int y=e[i].to;
dfs(y,x);
Max[x]=max(Max[x],Max[y]);
}
}
int kth(int x,int k){
if(dep[x]<=k)return 0;
int res=x;
while(k){
res=ff[res][lg[k&-k]];
k-=k&-k;
}
return res;
}
void add(int x){sum[dep[x]]++;}
void del(int x){sum[dep[x]]--;}
int main(){
cin>>n;
for(int i=2;i<=n;i++)
lg[i]=lg[i-1]+((1<<lg[i-1]+1)==i);
for(int i=1;i<=n;i++){
cin>>f[i];
if(f[i])Link(f[i],i);
}
for(int i=1;i<=n;i++)
if(!f[i])dfs(i,0);
cin>>m;
block=sqrt(n);
for(int i=1;i<=m;i++){
int v,p;
cin>>v>>p;
int k=kth(v,p);
q[i]=(Q){dfn[k],Max[k],(dfn[k]-1)/block+1,dep[v],i};
}
sort(q+1,q+1+m,cmp);
l=1;r=0;
for(int i=1;i<=m;i++){
if(q[i].l==0)continue;
while(l>q[i].l)add(--l);
while(l<q[i].l)del(l++);
while(r<q[i].r)add(++r);
while(r>q[i].r)del(r--);
ans[q[i].id]=sum[q[i].x];
}
for(int i=1;i<=m;i++)
cout<<(ans[i]?ans[i]-1:0)<<' ';
return 0;
}