Cod sursa(job #554964)
#include<fstream>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
int n;
int a[100001], t[100001], sol[100001], nivel[100001]; // t - sirul de tati
// sol - solutia
void Read(); // nivel - sirul de nivele
void Solve(); // a - sirul stramosilor la care este trimisa cererea
void DF(int x, int nod);
void Write();
int main()
{
Read();
Solve();
fin.close();
fout.close();
return 0;
}
void Read()
{
fin >> n;
for( int i = 1; i <= n; ++i )
fin >> a[i];
int x, y;
for( int i = 1; i <= n-1; ++i )
{
fin >> x >> y;
t[y] = x; // tatal lui y este x
}
}
void Solve()
{
for( int i = 1; i <= n; ++i )
if( t[i] == 0 ) //radacina
{
DF( i, 1);
Write();
return;
}
}
void DF( int x, int niv )
{
nivel[niv] = x; // pe nivelul niv se afla nodul x
if( a[x] != 0 ) // daca a[x] == 0 solutia este 0;
sol[x] = sol[ nivel[ niv - a[x] ] ] + 1; // ne uitam in sol [ nodului care se afla la nivelul[ nivelului curent - la al catelea stramos trebuie trimisa crererea ] + 1.
for( int i = 1; i <= n; ++i )
if( t[i] == x )
DF( i, niv+1 );
}
void Write()
{
for( int i = 1; i <= n; ++i )
fout << sol[i] << ' ';
}