Cod sursa(job #364464)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 15 noiembrie 2009 20:18:19
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <algorithm>
using namespace std;

#define DIM 100001
#define LOG 19

int n, k[ DIM ], cnt[ DIM ], sol[ LOG ][ DIM ];

void calc_sol() {

    int i, j;

    for( i = 1; i < LOG; ++i )
        for( j = 1; j <= n; ++j )
            sol[ i ][ j ] = sol[ i-1 ][ sol[ i-1 ][ j ] ];
}

void init_nr() {

    int i;

    for( i = 1; i <= n; ++i )
        cnt[ i ] = 0;
}

int calc( int nod, int nr ) {

    int i;

    for( i = 0; ( 1<<( i+1 ) ) <= nr; ++i );
    nr -= ( 1<<i );
    if( !nr )
        return sol[ i ][ nod ];

    return calc( sol[ i ][ nod ], nr );
}

int main() {

    freopen( "cerere.in", "r", stdin );
    freopen( "cerere.out", "w", stdout );

    int i, x, y, nod;

    scanf( "%d", &n );
    for( i = 1; i <= n; ++i )
        scanf( "%d", &k[ i ] );
    for( i = 1; i < n; ++i ) {

        scanf( "%d %d", &x, &y );
        sol[ 0 ][ y ] = x;
    }
    calc_sol();
    init_nr();
    for( i = 1; i <= n; ++i ) {

        nod = i;
        for( ; k[ nod ]; ++cnt[ i ] ) {

            nod = calc( nod, k[ nod ] );
            if( !k[ nod ] )
                cnt[ i ] += cnt[ nod ];
        }
        k[ i ] = 0;
        printf( "%d ", cnt[ i ] );
    }

    return 0;
}