Cod sursa(job #475789)

Utilizator darrenRares Buhai darren Data 8 august 2010 14:57:46
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
#include <deque>
#include <vector>

using namespace std;

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

void Read();
void Solve();
void Df(int x);
void Write();

int n, beg;
int k[100001], t[100001];
int gi[100001];
vector<int> v[100001];
deque<int> st;
bool s[100001];

int main()
{
	Read();
	Solve();
	Write();
}

void Read()
{
	fin >> n;
	for (int i = 1; i <= n; ++i)
		fin >> k[i];
	for (int i = 1, n1, n2; i < n; ++i)
	{
		fin >> n1 >> n2;
		v[n1].push_back(n2);
		++gi[n2];
	}
	fin.close();
}

void Solve()
{
	for (int i = 1; i <= n; ++i)
		if (gi[i] == 0)
		{
			beg = i;
			break;
		}
	Df(beg);
}

void Df(int x)
{
	st.push_back(x);
	s[x] = true;

	if (k[x] == 0) t[x] = 0;
	else           t[x] = t[st[st.size() - k[x] - 1]] + 1;

	for (vector<int>::iterator it = v[x].begin(); it != v[x].end(); ++it)
		if (s[*it] == false)
		{
			Df(*it);
		}

	st.pop_back();
}

void Write()
{
	for (int i = 1; i <= n; ++i)
		fout << t[i] << ' ';
	fout.close();
}