搞出灭绝树。
一群动物的祖先就是他们的灭绝祖先
倍增搞lca
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int M=110000;
int n,m,r[M],id[M],dep[M],f[M][21],tmp[M],cnt,ans[M];
vector <int> v[M],e[M];queue <int> q;
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;i--) if(f[x][i]&&dep[f[x][i]]>=dep[y]) x=f[x][i];
for(int i=20;i>=0;i--) if(f[x][i]&&f[y][i]&&f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return x==y?x:f[x][0];
}
int main(){
scanf("%d",&n);
for(int i=1,x;i<=n;i++)
while(scanf("%d",&x)&&x) e[i].push_back(x),v[x].push_back(i),r[i]++;
for(int i=1;i<=n;i++)if(!r[i]) q.push(i);
for(;!q.empty();){int x=q.front();q.pop();tmp[++cnt]=x;
for(int j=0;j<v[x].size();j++)
if(!(--r[v[x][j]])) q.push(v[x][j]);
}memset(r,0,sizeof r);dep[n+1]=1;
for(int i=1,j,LCA,x;i<=n;i++){;
if(!e[x=tmp[i]].size()){f[x][0]=n+1;dep[x]=2;continue;}
for(j=1,LCA=e[x][0];j<e[x].size();j++)LCA=lca(LCA,e[x][j]);
f[x][0]=LCA;r[LCA]++;dep[x]=dep[LCA]+1;
for(j=0;f[x][j];f[x][j+1]=f[f[x][j]][j],j++);
}
while(!q.empty()) q.pop();
for(int i=1;i<=n;ans[i]=1,i++)if(!r[i]) q.push(i);
for(;!q.empty();){int x=q.front();q.pop();
ans[f[x][0]]+=ans[x];
if(!(--r[f[x][0]])) q.push(f[x][0]);
}
for(int i=1;i<=n;i++) printf("%d\n",ans[i]-1);
}