Cod sursa(job #596014)

Utilizator savimSerban Andrei Stan savim Data 15 iunie 2011 12:30:58
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <stdio.h>

#define MAX_N 100010

int n;

int K[MAX_N], tata[20][MAX_N], ans[MAX_N];

inline int ancestor(int x, int nod) {
	for (int i = 17; i >= 0; i--)
		if ((1 << i) <= x) {
        	nod = tata[i][nod];	
			x -= 1 << i;
		}
			
	return nod;
}

void get_ans(int nod) {
	if (ans[nod] != 0 || K[nod] == 0)
		return;

	get_ans(ancestor(K[nod], nod));

	ans[nod] = 1 + ans[ancestor(K[nod], nod)];
}

void solve() {
	for (int i = 1; i < 20; i++)
		for (int j = 1; j <= n; j++)
			tata[i][j] = tata[i - 1][tata[i - 1][j]];
		
	for (int i = 1; i <= n; i++) {
		get_ans(i);
    	printf("%d ", ans[i]);
	}

	printf("\n");
}

int main() {

	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);

	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &K[i]);

	for (int i = 1; i < n; i++) {
    	int x, y;
		scanf("%d %d", &x, &y);

		tata[0][y] = x;
	}

	solve();

	return 0;
}