Pagini recente » Cod sursa (job #884912) | Cod sursa (job #517433) | Cod sursa (job #2177249) | Cod sursa (job #816712) | Cod sursa (job #2457500)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
const int NMAX = 1e5 + 5;
int N, Root, T[NMAX], A[NMAX], ans[NMAX];
int Who[NMAX];
bool Sel[NMAX];
vector < int > G[NMAX];
static inline void Read ()
{
f.tie(NULL);
f >> N;
for(int i = 1; i <= N; ++i)
f >> A[i];
for(int i = 1; i < N; ++i)
{
int X = 0, Y = 0;
f >> X >> Y;
T[Y] = X;
G[X].push_back(Y);
}
return;
}
static inline void Go (int Node, int Level)
{
Sel[Node] = true;
if(A[Node] == 0)
ans[Node] = 0;
else
ans[Node] = ans[Who[Level - A[Node]]] + 1;
Who[Level] = Node;
for(auto it : G[Node])
if(!Sel[it])
Go(it, Level + 1);
Who[Level] = 0;
}
int main()
{
Read();
for(int i = 1; i <= N; ++i)
if(!T[i])
{
Root = i;
break;
}
Go(Root, 1);
for(int i = 1; i <= N; ++i)
g << ans[i] << ' ';
g << '\n';
return 0;
}