Cod sursa(job #78799)

Utilizator tudalexTudorica Constantin Alexandru tudalex Data 19 august 2007 20:12:51
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <stdio.h>
#include <vector>
const int n_max = 100001;
using namespace std;
vector <int> v[n_max];
int a, b, i ,n, root;
int m[n_max], 
	stiv[n_max],
	s[n_max],
	p[n_max];
int find_root(int x)
{
	while (p[x] != 0)
		x = p[x];
	return x;
}
void df(int x)
{
	vector <int>::iterator it;
	stiv[++stiv[0]] = x;
	s[x] = s[stiv[stiv[0]-m[x]]] + 1;
	for (it = v[x].begin(); it != v[x].end(); ++ it)
		df(*it);
	stiv[0] --;
}
int main()
{
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d", &n);
	for (i = 1; i <= n; ++ i)
		scanf("%d",&m[i]);
	for (i = 1; i < n; ++ i)
	{
		scanf("%d %d", &a, &b);
		v[a].push_back(b);
		p[b] = a;
	}
	root = find_root(1);
	df(root);
	for (i = 1; i <= n; ++ i)
		printf("%d ",s[i]-1);
	return 0;
}