Pagini recente » Borderou de evaluare (job #2040303) | Borderou de evaluare (job #1551117) | Borderou de evaluare (job #2052022) | Cod sursa (job #3174981) | Cod sursa (job #47160)
Cod sursa(job #47160)
#include <cstdio>
#include <string>
#define FIN "cerere.in"
#define FOUT "cerere.out"
#define NMAX 100001
#define INF 0x3f3f3f3f
int a[31][NMAX], K[NMAX], s[NMAX], str[NMAX], N;
void read ()
{
int x, y;
scanf ("%d", &N);
memset (s, INF, sizeof (s));
for (int i = 1; i <= N; ++ i)
{
scanf ("%d", &K[i]);
if (!K[i])
str[i] = s[i] = 0;
}
for (int i = 1; i < N; ++ i)
{
scanf ("%d%d", &x, &y);
a[0][y] = x;
}
for (int k = 1; k <= 30; ++ k)
for (int i = 1; i <= N; ++ i)
a[k][i] = a[k-1][a[k-1][i]];
}
int search (int stramos, int nod)
{
int nodc = nod;
for (int i = 0; i <= 30; ++ i)
if (((stramos & (1 << i)) != 0))
nodc = a[i][nodc];
return nodc;
}
int remake (int nod)
{
if (s[nod] < INF)
return s[nod];
else
return s[nod] = remake(str[nod]) + 1;
}
void solve ()
{
for (int i = 1; i <= N; ++ i)
if (K[i])
str[i] = search (K[i], i);
/*for (int i = 1; i <= N; ++ i)
if (s[i] >= INF)
remake (i);*/
int ct, j;
for (int i = 1; i <= N; ++ i)
if (s[i])
{
ct = 0;
j = i;
while (str[j])
{
j = str[j];
++ ct;
}
s[i] = ct;
}
for (int i = 1; i <= N; ++ i)
printf ("%d ", s[i]);
printf ("\n");
}
int
main ()
{
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
read ();
solve ();
return 0;
}