Cod sursa(job #388592)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 30 ianuarie 2010 14:39:33
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <algorithm>
#include <deque>
#include <vector>
using namespace std;

#define DIM 100001
#define fr front()
#define pb push_back
#define ppb pop_back()
#define sz size()

int N, R;
int cnt, e[ 2*DIM ], k[ DIM ], t[ DIM ], sol[ DIM ];
vector <int> s, v[ DIM ];

inline void df_e( const int &A ) {

    unsigned int I;

    e[ ++cnt ] = A;
    for( I = 0; I < v[ A ].sz; ++I ) {

        df_e( v[ A ][ I ] );
        e[ ++cnt ] = A;
    }
}

int main() {

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

    int A, B;
    int i;

    scanf( "%d", &N );
    for( i = 1; i <= N; ++i ) {

        scanf( "%d", &k[ i ] );
        if( k[ i ] )
            sol[ i ] = -1;
    }
    for( i = 1; i < N; ++i ) {

        scanf( "%d %d", &A, &B );
        t[ B ] = A;
        v[ A ].pb( B );
    }

//    for( i = 1; i <= N; ++i )
//        printf( "%d\n", t[ i ] );

    for( i = 1; i <= N; ++i )
        if( t[ i ] == 0 ) {

            R = i;
            i = N;
        }
    df_e( R );

//    for( i = 1; i < 2*N; ++i )
//        printf( "%d ", e[ i ] );

    s.pb( R );
    for( i = 2; i < 2*N; ++i )
        if( e[ i ] == t[ s.back() ] )
            s.ppb;
        else {

            s.pb( e[ i ] );
            if( sol[ e[ i ] ] )
                sol[ e[ i ] ] = sol[ s[ s.sz - k[ e[ i ] ] - 1 ] ] + 1;
        }

    for( i = 1; i <= N; ++i )
        printf( "%d ", sol[ i ] );

    return 0;
}