Pagini recente » Cod sursa (job #997713) | Cod sursa (job #1074934) | Cod sursa (job #1204225) | Cod sursa (job #1429304) | Cod sursa (job #2691219)
#include <cstdio>
#include <cctype>
#include <vector>
using namespace std;
const int MaxN = 100002;
FILE *fin = fopen( "cerere.in", "r" );
FILE *fout = fopen( "cerere.out", "w" );
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 getNum() {
int n = 0;
char ch;
while ( isspace( ch = fgetc( fin ) ) );
do {
n = n * 10 + ch - '0';
} while ( isdigit( ch = fgetc( fin ) ) );
return n;
}
void giveNum( int n ) {
int m = n, p = 10;
while ( m > 9 ) {
p *= 10;
m /= 10;
}
p /= 10;
while ( p > 0 ) {
fputc( n / p + '0', fout );
n %= p;
p /= 10;
}
fputc( ' ', fout );
}
int main() {
int n, x, y;
n = getNum();
for ( int i = 0; i < n; ++i ) {
k[i] = getNum();
}
for ( int i = 1; i < n; ++i ) {
x = getNum();
y = getNum();
--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 ) {
giveNum( nq[i] );
}
fclose( fin );
fclose( fout );
return 0;
}