Cod sursa(job #596337)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 16 iunie 2011 22:03:22
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <fstream>
#include <vector>
#include <cstring>

#define NMAX 100005
#define pb push_back

using namespace std;

ifstream in("cerere.in");
ofstream out("cerere.out");

vector< int > A[NMAX];
int NrMaimute[NMAX], D[NMAX], i, N, Tata, Fiu, Stramos[NMAX];
bool AreTata[NMAX];

inline void DF( int Nod, int Nivel )
{
    Stramos[Nivel] = Nod;
    ( NrMaimute[Nod] ) ? D[Nod] = D[ Stramos[ Nivel - NrMaimute[Nod] ] ] + 1 : D[Nod] = 0;

    for( vector< int >::iterator F = A[Nod].begin(); F != A[Nod].end(); F++ )
        DF( *F, Nivel+1 );
}

int main()
{
    in >> N;
    for( i = 1; i <= N; i++ )
        in >> NrMaimute[i];

    memset( AreTata, false, sizeof(AreTata) );
    for( i = 1; i < N; i++ )
    {
        in >> Tata >> Fiu;
        AreTata[Fiu] = true;
        A[Tata].pb( Fiu );
    }

    for( i = 1; AreTata[i]; i++ );
    DF( i, 1 );

    for( i = 1; i <= N; i++ )
        out << D[i] << ' ';
    out << '\n';

    return 0;
}