Pagini recente » Cod sursa (job #478952) | Cod sursa (job #3200429) | Cod sursa (job #1953360) | Cod sursa (job #998449) | Cod sursa (job #388592)
Cod sursa(job #388592)
#include <algorithm>
#include <deque>
#include <vector>
using namespace std;
#define DIM 100001
#define fr front()
#define pb push_back
#define ppb pop_back()
#define sz size()
int N, R;
int cnt, e[ 2*DIM ], k[ DIM ], t[ DIM ], sol[ DIM ];
vector <int> s, v[ DIM ];
inline void df_e( const int &A ) {
unsigned int I;
e[ ++cnt ] = A;
for( I = 0; I < v[ A ].sz; ++I ) {
df_e( v[ A ][ I ] );
e[ ++cnt ] = A;
}
}
int main() {
freopen( "cerere.in", "r", stdin );
freopen( "cerere.out", "w", stdout );
int A, B;
int i;
scanf( "%d", &N );
for( i = 1; i <= N; ++i ) {
scanf( "%d", &k[ i ] );
if( k[ i ] )
sol[ i ] = -1;
}
for( i = 1; i < N; ++i ) {
scanf( "%d %d", &A, &B );
t[ B ] = A;
v[ A ].pb( B );
}
// for( i = 1; i <= N; ++i )
// printf( "%d\n", t[ i ] );
for( i = 1; i <= N; ++i )
if( t[ i ] == 0 ) {
R = i;
i = N;
}
df_e( R );
// for( i = 1; i < 2*N; ++i )
// printf( "%d ", e[ i ] );
s.pb( R );
for( i = 2; i < 2*N; ++i )
if( e[ i ] == t[ s.back() ] )
s.ppb;
else {
s.pb( e[ i ] );
if( sol[ e[ i ] ] )
sol[ e[ i ] ] = sol[ s[ s.sz - k[ e[ i ] ] - 1 ] ] + 1;
}
for( i = 1; i <= N; ++i )
printf( "%d ", sol[ i ] );
return 0;
}