Pagini recente » Cod sursa (job #2836980) | Cod sursa (job #1604259) | Cod sursa (job #2464045) | Cod sursa (job #875715) | Cod sursa (job #2691212)
#include <fstream>
#include <vector>
using namespace std;
const int MaxN = 100002;
ifstream fin( "cerere.in" );
ofstream fout( "cerere.out" );
vector<int> T[MaxN];
int root[MaxN];
int k[MaxN];
int vis[MaxN], vis_val;
int s[MaxN], sp;
int nq[MaxN];
void DFS( int node ) {
s[sp++] = node;
vis[node] = vis_val;
if ( k[node] ) {
nq[node] = nq[s[sp - k[node] - 1]] + 1;
}
for ( int i = 0; i < T[node].size(); ++i ) {
if ( vis[T[node][i]] != vis_val ) {
DFS( T[node][i] );
}
}
--sp;
}
int main() {
int n, x, y;
fin >> n;
for ( int i = 0; i < n; ++i ) {
fin >> k[i];
}
for ( int i = 1; i < n; ++i ) {
fin >> x >> y;
--x;
--y;
T[x].push_back( y );
T[y].push_back( x );
root[y] = 1;
}
vis_val = 1;
for ( int i = 0; i < n; ++i ) {
if ( !root[i] ) {
DFS( i );
++vis_val;
}
}
for ( int i = 0; i < n; ++i ) {
fout << nq[i] << " ";
}
fin.close();
fout.close();
return 0;
}