Cod sursa(job #364472)

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

#define DIM 100001
#define LOG 18

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

inline 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 ] ];
}

inline void init_nr() {

    int i;

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

inline int calc( int nod, int nr ) {

    int i;

    while( nr ) {

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

    return sol[ i ][ nod ];
}

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;
}