Pagini recente » Cod sursa (job #1174842) | Cod sursa (job #1552898) | Cod sursa (job #1961179) | Cod sursa (job #1510848) | Cod sursa (job #1794019)
#include <cstdio>
const int MAX_N = 100000;
const int MAX_LOG = 18;
int up[1+MAX_N];
int d[1+MAX_LOG][1+MAX_N];
int dist[1+MAX_N];
int stramos(int nod, int level) {
for(int i = 0; i < MAX_LOG; ++i)
if((1 << i) & level)
nod = d[i][nod];
return nod;
}
int calcDist(int nod) {
//printf("%d->%d;", nod, up[nod]);
if(dist[nod] == -1) {
if(up[nod] == 0)
dist[nod] = 0;
else
dist[nod] = calcDist(up[nod]) + 1;
}
return dist[nod];
}
int main() {
int n, a, b;
FILE *fin = fopen("cerere.in", "r");
fscanf(fin, "%d", &n);
for(int i = 1; i <= n; ++i)
fscanf(fin, "%d", &up[i]);
for(int i = 0; i < n - 1; ++i) {
fscanf(fin, "%d%d", &a, &b);
d[0][b] = a;
}
fclose(fin);
for(int i = 1; i <= MAX_LOG; ++i)
for(int j = 1; j <= n; ++j)
d[i][j] = d[i - 1][d[i - 1][j]];
for(int i = 1; i <= n; ++i) {
if(up[i] > 0)
up[i] = stramos(i, up[i]);
dist[i] = -1;
}
FILE *fout = fopen("cerere.out", "w");
for(int i = 1; i <= n; ++i)
fprintf(fout, "%d ", calcDist(i));
fclose(fout);
return 0;
}