RT,代码如下:
#include<bits/stdc++.h>
#define ll long long
#define INF 214748364719260817ll
using namespace std;
ll n,q;
ll f[1000005][25],lg[1000005];
ll tp[1000005],son[1000005],dep[1000005],md[1000005],dfn[1000005],size[1000005],to[1000005],tot;
ll head[1000005],cntt;
ll box[1000005],ls[1000005],ans[1000005],cnt[1000005];
vector<ll>up[1000005],down[1000005];vector<ll>jl[1000005];
struct px
{
ll dep,uid;
};
vector<px>query[1000005];
struct ed
{
ll v,next;
}edge[2000005];
void add(ll u,ll v)
{
edge[++cntt].v=v;edge[cntt].next=head[u];head[u]=cntt;
edge[++cntt].v=u;edge[cntt].next=head[v];head[v]=cntt;
}
void dfs(ll id,ll fa)
{
size[id]=1;
for(ll i=head[id];i;i=edge[i].next)
{
ll v=edge[i].v;
if(v==fa)continue;
md[v]=dep[v]=dep[id]+1;
f[v][0]=id;
for(ll j=1;j<=lg[dep[v]];++j)f[v][j]=f[f[v][j-1]][j-1];
dfs(v,id);
size[id]+=size[v];
if(md[id]<md[v])
son[id]=v,md[id]=md[v];
}
}
void dfs2(ll id,ll top)
{
dfn[++tot]=id;to[id]=tot;
tp[id]=top;down[top].push_back(id);
if(son[id])dfs2(son[id],top);
for(ll i=head[id];i;i=edge[i].next)
{
ll v=edge[i].v;
if(v==f[id][0]||v==son[id])continue;
dfs2(v,v);
}
if(id==top)
for(ll i=0,u=id;i<=md[id]-dep[id];++i,u=f[u][0])
up[id].push_back(u);
}
ll get_kth(ll id,ll k)
{
ll y=tp[f[id][lg[k]]];
if(!y)return 0;
if(dep[id]-dep[y]>=k)return down[y][dep[id]-dep[y]-k];
return up[y][k+dep[y]-dep[id]];
}
void get_ans(ll id,ll fa)
{
ll summ=query[id].size();
for(ll i=0;i<summ;++i)jl[id].push_back(cnt[query[id][i].dep]);
for(ll i=head[id];i;i=edge[i].next)
{
ll v=edge[i].v;
if(v==fa)continue;
++cnt[dep[v]];
get_ans(v,id);
}
for(ll i=0;i<summ;++i)ans[query[id][i].uid]=cnt[query[id][i].dep]-jl[id][i];
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>q;
ll v;
for(ll i=2;i<=n;++i)cin>>v,add(i,v),lg[i]=lg[i>>1]+1;
dep[1]=1;
dfs(1,0);
dfs2(1,1);
ll u,k;
for(ll i=1;i<=q;++i)
{
cin>>u>>k;
ll p=get_kth(u,k);
if(p)
query[p].push_back((px){k+dep[p],i});
else
ans[i]=1;
}
get_ans(1,0);
for(ll i=1;i<=q;++i)
cout<<ans[i]-1<<' ';
}