RE 了好久,找不到 bug 。
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(l);i>=(r);i--)
using namespace std;
const int N=1000005;
struct request {
int id,k,u;
};
request make(int x,int y,int z) {
request p; p.id=x,p.k=y,p.u=z; return p;
}
inline int read() {
int x=0;char c=getchar();
while(c>'9'||c<'0')c=getchar();
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x;
}
int n,q,buf[N],*f[N],*cnt=buf,rt;
int fa[N],dep[N],son[N];
int top=0,nxt[2*N],fir[N],ver[2*N];
int ans[N],k[N],sta[N],tp;
vector<request>req[N];
void add(int x,int y) {
ver[++top]=y,nxt[top]=fir[x],fir[x]=top; return ;
}
void dfs1(int u,int fa) {
sta[++tp]=u;
for(int i=0;i<req[u].size();i++)
req[u][i].u=(tp>req[u][i].k)?sta[tp-req[u][i].k]:0;
for(int i=fir[u];i;i=nxt[i]) {
if(ver[i]==fa) continue; dfs1(ver[i],u);
if(dep[ver[i]]>dep[son[u]]) son[u]=ver[i];
} dep[u]=dep[son[u]]+1; --tp;
}
void dfs2(int u,int fa) {
f[u][0]=1; if(son[u]) f[son[u]]=f[u]+1,dfs2(son[u],u);
for(int i=fir[u];i;i=nxt[i]) {
if(ver[i]==fa||ver[i]==son[u]) continue;
f[ver[i]]=cnt; cnt+=dep[ver[i]]; dfs2(ver[i],u);
rep(j,1,dep[ver[i]]) f[u][j]+=f[ver[i]][j-1];
}
return ;
}
int main() {
n=read();
rep(i,1,n) {
int u=read(),v=i; add(u,v),add(v,u),fa[i]=u;
} q=read(); rep(i,1,q) req[read()].push_back(make(i,read(),0));
rep(i,1,n) if(!fa[i]) dfs1(i,0);
rep(i,1,n) if(!fa[i]) f[i]=cnt,cnt+=dep[i],dfs2(i,0);
rep(i,1,n) for(int j=0;j<req[i].size();j++) ans[req[i][j].id]=f[req[i][j].u][req[i][j].k];
rep(i,1,q) printf("%d ",ans[i]);
return 0;
}