讲解:https://blog.csdn.net/qq_45458915/article/details/102960953
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+10;
int h[N],e[N*2],ne[N*2],idx;
int in[N],out[N],deep[N];
vector<int> d[N];
int f[N][20];
int maxx=1;
int ans=0;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(int x,int fa,int dd)
{
in[x]=++ans;
f[x][0]=fa;
deep[x]=dd;maxx=max(maxx,dd);
d[dd].push_back(in[x]);
for(int i=1;i<=17;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=h[x];i!=-1;i=ne[i])
{
int j=e[i];
dfs(j,x,dd+1);
}
out[x]=++ans;
}
int query(int v,int p)
{
int vv=v;
for(int i=0;i<=17;i++)
{
if((p>>i)&1) v=f[v][i];
}
if(v==0) return 0;
int l=in[v],r=out[v];
int a=lower_bound(d[deep[vv]].begin() ,d[deep[vv]].end(),l)-d[deep[vv]].begin();
int b=upper_bound(d[deep[vv]].begin() ,d[deep[vv]].end(),r)-d[deep[vv]].begin();
return b-a-1;
}
int main()
{
vector<int> root;
memset(h,-1,sizeof h);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(!x)
{
root.push_back(i);
}
else
{
add(x,i);
}
}
for(int i=0;i<root.size() ;i++)
{
dfs(root[i],0,1);
}
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
int v,p;
scanf("%d%d",&v,&p);
if(i==1)
printf("%d",query(v,p));
else printf(" %d",query(v,p));
}
}