Cod sursa(job #2316221)

Utilizator Andrei-27Arhire Andrei Andrei-27 Data 11 ianuarie 2019 14:11:11
Problema Cerere Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#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 ) << " " ;
}