Cod sursa(job #364438)

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

#define DIM 100001
#define LOG 18

int n, k[ DIM ], nr[ 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 )
        nr[ i ] = 1;
}

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, cnt, 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( cnt = 0; k[ nod ]; cnt += nr[ nod ] ) {

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

    return 0;
}