Pagini recente » Cod sursa (job #495745) | Cod sursa (job #2204955) | Cod sursa (job #1477449) | Cod sursa (job #1460963) | Cod sursa (job #2316230)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("cerere.in") ;
ofstream g ("cerere.out") ;
const int NR = 100001 ;
int rmq_father[ 20 ][ NR ] , c [ NR ] , d [ NR ] , n , k , lg , pu ;
void rmq ()
{
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 ( !c [ nod ] ) return 0 ;
if ( d [ nod ] )
return d [ nod ] ;
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 ;
rmq_father[ 0 ][ b ] = a ;
}
rmq() ;
for( int i = 1 ; i <= n ; ++ i )
g << solve ( i ) << " " ;
}