Pagini recente » Cod sursa (job #3191853) | Cod sursa (job #54314) | Cod sursa (job #609532) | Cod sursa (job #2136656) | Cod sursa (job #352684)
Cod sursa(job #352684)
#include <stdio.h>
#define nmax 100005
int n, k [nmax], s [nmax], a [21] [nmax];
void scan ()
{
int i, A, B;
scanf ("%d", &n);
for (i=1; i <= n; ++i)
scanf ("%d", &k [i]);
for (i=1; i < n; ++i)
{
scanf ("%d%d", &A, &B);
a [0] [B]=A;
}
}
void preg ()
{
int i, j;
for (i=1; i <= 19; ++i)
for (j=1; j <= n; ++j)
a [i] [j]=a [i-1] [a [i-1] [j]];
}
void init ()
{
for (int i=1; i <= n; ++i)
s [i]=-1;
}
int rez (int x)
{
int p=x, q=k [x], u, i;
if (s [p] != -1)
return s [p];
if (k [p] == 0)
{
s [p]=0;
return s [p];
}
for (i=0, u=1; i <= 19; ++i, u <<= 1)
if (q & u)
p=a [i] [p];
s [x]=1+rez (p);
return s [x];
}
void print ()
{
int i;
for (i=1; i <= n; ++i)
printf ("%d ", s [i]);
printf ("\n");
}
int main ()
{
freopen ("cerere.in", "r", stdin);
freopen ("cerere.out", "w", stdout);
scan ();
preg ();
init ();
for (int i=1; i <= n; ++i)
if (s [i] == -1)
s [i]=rez (i);
print ();
return 0;
}