8分代码不知道哪里错了
#include<cstdio>
#include<iostream>
#define M 10000017
#define N 1000017
using namespace std;
struct edge
{
int v,next;
}e[N];
int dep[N],father[N][21],pow[21],rt[N],head[N],tot,cnt,n,m;
int lc[M],rc[M],sum[M];
void add(int u,int v)
{
e[++tot].v = v;
e[tot].next = head[u];
head[u] = tot;
}
void change(int k,int l,int r,int pos)
{
if(l == pos && pos == r)
{
sum[k] = 1;
return;
}
int mid = (l + r) >> 1;
if(pos <= mid)change(lc[k] = ++cnt,l,mid,pos);
else change(rc[k] = ++cnt,mid + 1,r,pos);
}
bool sroot[N];
void merge(int k,int t,int l,int r)
{
if(l == r){
sum[k] += sum[t];
return;
}
int mid = (l + r) >> 1;
if(lc[t]){
if(!lc[k])lc[k] = lc[t];
else merge(lc[k],lc[t],l,mid);
}
if(rc[t]){
if(!rc[k])rc[k] = rc[t];
else merge(rc[k],rc[t],mid + 1,r);
}
}
void dfs1(int u,int fa)
{
dep[u] = dep[fa] + 1;
change(rt[u] = ++cnt,1,n,dep[u]);
father[u][0] = fa;
for(int i = 1;i <= 20;i += 1)
father[u][i] = father[father[u][i - 1]][i - 1];
for(int i = head[u];i;i = e[i].next){
int v = e[i].v;
dfs1(v,u);
}
}
void dfs2(int u,int fa)
{
for(int i = head[u];i;i = e[i].next){
int v = e[i].v;
dfs2(v,u);
merge(rt[u],rt[v],1,n);
}
}
int getfa(int x,int y)
{
int delta = y;
for(int i = 20;i >= 0;i -= 1)
if(pow[i] <= delta){
delta -= pow[i];
x = father[x][i];
}
return x;
}
int query(int k,int l,int r,int pos)
{
if(l == pos && pos == r)return sum[k];
int mid = (l + r) >> 1;
if(pos <= mid){
if(!lc[k])return 0;
return query(lc[k],l,mid,pos);
}
else {
if(!rc[k])return 0;
return query(rc[k],mid + 1,r,pos);
}
}
int main()
{
pow[0] = 1;
for(int i = 1;i <= 20;i += 1)
pow[i] = pow[i - 1] * 2;
scanf("%d",&n);
for(int i = 1,fa;i <= n;i += 1)
{
scanf("%d",&fa);
add(fa,i);
if(fa == 0)sroot[i] = 1;
}
for(int i = 1;i <= n;i += 1)
if(sroot[i])dfs1(i,0);
for(int i = 1;i <= n;i += 1)
if(sroot[i])dfs2(i,0);
scanf("%d",&m);
for(int q = 1,v,p;q <= m;q += 1)
{
scanf("%d%d",&v,&p);
int to = getfa(v,p);
if(to == 0){
printf("0 ");
continue;
}
printf("%d ",query(rt[to],1,n,dep[v]) - 1);
}
return 0;
}