Cod sursa(job #858474)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int n;
int stramos[100010];
int st[100010], vf, rad, grad[100010], sol[100010];
vector <int> G[100010];
inline void Read()
{
ifstream f("cerere.in");
f>>n;
int i;
for(i=1; i<=n; i++)
f>>stramos[i];
int tata, fiu;
for(i=1; i<n; i++)
{
f>>tata>>fiu;
G[tata].push_back(fiu);
grad[fiu]++;
}
f.close();
}
inline void DFS(int x)
{
st[++vf] = x;
if (stramos[x] == 0)
sol[x] = 0;
else
sol[x] = sol[st[vf-stramos[x]]]+1;
vector <int>::iterator it;
for (it=G[x].begin(); it!=G[x].end(); it++)
DFS(*it);
vf--;
}
inline void Solve()
{
int i;
for(i=1; i<=n; i++)
if (!grad[i])
rad = i, i = n+1;
DFS(rad);
}
inline void Write()
{
ofstream g("cerere.out");
int i;
for(i=1; i<=n; i++)
g<<sol[i]<<" ";
g<<"\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}