Pagini recente » Cod sursa (job #369780) | Simulare 15a | Cod sursa (job #1874196) | Cod sursa (job #3170914) | Cod sursa (job #352798)
Cod sursa(job #352798)
#include <stdio.h>
#define N 1<<17
#define Q 1<<5
int n,nr[N],sol[N],parinte[Q][N];
char viz[N];
void read()
{
scanf("%d\n",&n);
int i,x,y;
for (i=1; i<=n; i++)
scanf("%d",&nr[i]);
for (i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
parinte[0][y]=x;
}
}
void precalculate()
{
int i,j;
for (i=1; (1<<i)<=n; i++)
for (j=1; j<=n; j++)
parinte[i][j]=parinte[i-1][parinte[i-1][j]];
}
int stramos(int nod,int q)
{
int i=0;
while (q)
{
if (q%2)
nod=parinte[i][nod];
q/=2;
i++;
}
return nod;
}
void solve(int nod)
{
viz[nod]=1;
int t=nod;
t=stramos(nod,nr[nod]);
if (!viz[t])
{
solve(t);
sol[nod]=sol[t]+1;
}
else
sol[nod]=sol[t]+1;
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
read();
precalculate();
for (int i=1; i<=n; i++)
{
if (!viz[i])
solve(i);
printf("%d ",sol[i]-1);
}
return 0;
}