Cod sursa(job #1091940)

Utilizator pulseOvidiu Giorgi pulse Data 26 ianuarie 2014 12:13:33
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 100003

int n, nr = 0;
int q[NMAX], sol[NMAX], tata[NMAX];
bool used[NMAX], r[NMAX];
vector <int> v[NMAX];

void ReadData()
{
	scanf ("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf ("%d", &tata[i]);
	for (int i = 1, a, b; i <= n - 1; ++i)
	{
		scanf ("%d %d", &a, &b);
		v[a].push_back(b);
		r[b] = true;
	}
}

void DFS (int k)
{
	used[k] = 1;
	q[++nr] = k;
	sol[k] = sol[q[nr - tata[k]]] + 1;
	for (int i = 0; i < v[k].size(); ++i)
	{
		if (!used[v[k][i]])
		{
			used[v[k][i]] = true;
			DFS (v[k][i]);
		}
	}
	--nr;
}

void Solve()
{
	for (int i = 1; i <= n; ++i)
	{
		if (!r[i])
		{
			DFS (i);
			break;
		}
	}
}

void WriteData()
{
	for (int i = 1; i <= n; ++i)
		printf ("%d ", sol[i] - 1);
}

int main()
{
	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);
	ReadData();
	Solve();
	WriteData();
}