Pagini recente » Cod sursa (job #270800) | Cod sursa (job #2139244) | Cod sursa (job #1889333) | Cod sursa (job #2745875) | Cod sursa (job #2317122)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
const int NMAX=1e5+5;
int T[NMAX];
int N, K[NMAX], Root, ans[NMAX], Level[NMAX], Last[NMAX];
vector <int> G[NMAX];
bool Sel[NMAX];
inline void Read ()
{
f.tie(NULL);
f>>N;
for(int i=1; i<=N; ++i)
f>>K[i];
for(int i=1; i<N; ++i)
{
int X, Y;
f>>X>>Y;
T[Y]=X;
G[X].push_back(Y);
}
}
inline void DFS (int From, int To)
{
Sel[To]=true;
for(int i=0; i<(int)G[To].size(); ++i)
if(!Sel[G[To][i]])
{
Level[G[To][i]]=Level[To]+1;
Last[Level[G[To][i]]]=G[To][i];
if(K[G[To][i]] != 0)
ans[G[To][i]]=ans[Last[Level[G[To][i]]-K[G[To][i]]]]+1;
DFS(To, G[To][i]);
}
}
inline void Solve ()
{
for(int i=1; i<=N && !Root; ++i)
if(!T[i])
Root=i;
DFS(-1, Root);
for(int i=1; i<=N; ++i)
g<<ans[i]<<' ';
g<<'\n';
}
int main()
{
Read();
Solve();
return 0;
}