Cod sursa(job #369088)

Utilizator Mishu91Andrei Misarca Mishu91 Data 26 noiembrie 2009 23:38:28
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.74 kb
#include <fstream>
#include <vector>

using namespace std;

#define MAX_N 100005
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)

ifstream fin ("cerere.in");
ofstream fout ("cerere.out");

int N, R, K[MAX_N], Sol[MAX_N], St[MAX_N], T[MAX_N];
vector <int> G[MAX_N];

void citire()
{
	fin >> N;

	for(int i = 1; i <= N; ++i)
		fin >> K[i];

	for(int i = 1; i < N; ++i)
	{
		int x, y;
		fin >> x >> y;
		G[x].push_back(y);
		T[y] = x;
	}

	for(int i = 1; i <= N; ++i)
		if(!T[i])
			R = i;
}

void dfs(int nod)
{
	St[++St[0]] = nod;

	if(K[nod])
		Sol[nod] = Sol[St[St[0] - K[nod]]] + 1;

	foreach(G[nod])
		dfs(*it);

	--St[0];
}

int main()
{
	citire();
	dfs(R);
	for(int i = 1; i <= N; ++i)
		fout << Sol[i] << " ";
}