Pagini recente » Cod sursa (job #3246352) | Cod sursa (job #1498197) | Cod sursa (job #3224489) | Cod sursa (job #1696516) | Cod sursa (job #2316221)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("cerere.in") ;
ofstream g ("cerere.out") ;
const int NR = 100001 ;
int Father [ NR ] , rmq_father[ 20 ][ NR ] , c [ NR ] , d [ NR ] , n , k , lg , pu ;
bool viz [ NR ] ;
void rmq ()
{
for ( int i = 1 ; i <= n ; ++ i ) rmq_father [ 0 ][ i ] = Father [ i ] ;
for ( int i = 1 ; ( 1 << i ) <= n ; ++ i )
for ( int j = 1 ; j <= n ; ++ j ) rmq_father [ i ][ j ] = rmq_father [ i - 1 ][ rmq_father [ i - 1 ][ j ] ] ;
}
int log ( int n )
{
if ( n == 1 ) return 0 ;
return 1 + log ( n >> 1 ) ;
}
int solve ( int nod )
{
if ( viz [ nod ] ) return d [ nod ] ;
if ( !c [ nod ] ) return 0 ;
int copie = nod ;
lg = pu ;
k = c [ nod ] ;
while ( lg -- ) if ( k & ( 1 << lg ) ) nod = rmq_father[ lg ][ nod ] ;
d [ copie ] = solve ( nod ) ;
return 1 + d [ copie ] ;
}
int main ()
{
f >> n ;
pu = log ( n ) ;
for ( int i = 1 ; i <= n ; ++ i ) f >> c [ i ] ;
for ( int i = 1 ; i < n ; ++ i )
{
int a , b ; f >> a >> b ;
Father [ b ] = a ;
}
rmq() ;
for( int i = 1 ; i <= n ; ++ i )
g << solve ( i ) << " " ;
}