Pagini recente » Cod sursa (job #1226366) | Cod sursa (job #1309292) | Cod sursa (job #1951041) | Cod sursa (job #1854231) | Cod sursa (job #352800)
Cod sursa(job #352800)
#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++)//al 2^i-lea stramos al lui j
for (j=1; j<=n; j++)
parinte[i][j]=parinte[i-1][parinte[i-1][j]];
}
int stramos(int nod,int q)//fac descompunerea in baza 2 al lui q
{
int i=0;
while (q)
{
if (q&1)
nod=parinte[i][nod];
q>>=1;
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;
}