rt.但是不知道发生了什么。
struct edge{
int to,nxt;
}e[200010];
struct Query{
int v,p,ans;
}ask[200010];
struct QQuery{
int ans,dep,id;
};std::vector<QQuery>query[200010];
int cnt,dfncnt,head[100010],size[100010],bigc[100010];
int col[200010],num[200010],llim[200010],rlim[200010];
int dfn[200010],fath[200010];
int ance[20][200010];
void add(int u,int v){
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void add(int u){++num[col[u]];}
void del(int u){--num[col[u]];}
int getans(int dep){return num[dep];}
void dfs0(int u,int fa){
dfn[++dfncnt]=u,llim[u]=dfncnt,size[u]=1,col[u]=col[fa]+1;
for(int i=head[u];i;i=e[i].nxt){
dfs0(e[i].to,u),size[u]+=size[e[i].to];
if(bigc[u]==0||size[bigc[u]]<size[e[i].to])bigc[u]=e[i].to;
}rlim[u]=dfncnt;ance[0][u]=fa;for(int i=1;i<=18;++i)ance[i][u]=ance[i-1][ance[i-1][u]];
}
void dfs1(int u,int fa,bool keep){
for(int i=head[u];i;i=e[i].nxt)if(e[i].to!=bigc[u])
dfs1(e[i].to,u,0);
if(bigc[u])dfs1(bigc[u],u,1);
for(int i=head[u];i;i=e[i].nxt)if(e[i].to!=bigc[u])
for(int j=llim[e[i].to];j<=rlim[e[i].to];++j)add(dfn[j]);
add(u);for(auto &i:query[u])i.ans=getans(i.dep)-1;
if(!keep)for(int i=llim[u];i<=rlim[u];++i)del(dfn[i]);
}
signed main() {
clock_t c1 = clock();
#ifdef LOCAL
freopen("in.in", "r", stdin);
freopen("out.out", "w", stdout);
#endif
//------------------------------------------------------------------
int n,m;read(n);
for(int i=1;i<=n;++i){
read(fath[i]);
if(fath[i]!=0)add(fath[i],i);
}read(m);
for(int i=1;i<=m;++i)read(ask[i].v),read(ask[i].p);
for(int i=1;i<=n;++i)if(fath[i]==0)dfs0(i,0);
for(int i=1;i<=m;++i){
int pp=ask[i].p,now=ask[i].v;
//if(col[now]<=pp){ask[i].ans=0;continue;};
for(int j=18;j>=0;--j)if(pp>=(1<<j)){
pp-=(1<<j);now=ance[j][now];
}query[now].push_back({0,col[ask[i].v],i});
debug("%d %d %d\n",ask[i].p,ask[i].v,now);
}
for(int i=1;i<=n;++i)if(fath[i]==0){memset(num,0,sizeof(num));dfs1(i,0,0);}
for(int i=1;i<=n;++i)for(auto j:query[i])ask[j.id].ans=j.ans;
for(int i=1;i<=m;++i)print(ask[i].ans,' ');
//------------------------------------------------------------------
end:
std::cerr << "Time : " << clock() - c1 << " ms" << std::endl;
return 0;
}