Cod sursa(job #1538144)

Utilizator BLz0rDospra Cristian BLz0r Data 28 noiembrie 2015 16:09:04
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <vector>
#include <string>
using namespace std;

#define Nmax 100002

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

int Query[Nmax], Tata[Nmax], Sol[Nmax], Stiva[Nmax];
vector < int > Arb[Nmax];

int ind = 0;

void DFS ( int nod ){

    Stiva[++ind] = nod;

    if ( Query[nod] != 0 )
        Sol[nod] = Sol[Stiva[ind-Query[nod]]] + 1;

    vector < int > :: iterator it;
    for ( it = Arb[nod].begin(); it != Arb[nod].end(); ++it )
        DFS ( *it );

    ind--;
}

string Buffer;
string :: iterator it;

int ReadInt(){

    int nr = 0;

    while ( *it < '0' || *it > '9' )
        it++;

    while ( *it >= '0' && *it <= '9' ){
        nr = nr * 10 + ( *it-'0' );
        it++;
    }

    return nr;
}

int main(){

    int N, x, y;

    getline ( fin, Buffer, (char)0 );
    it = Buffer.begin();

    N = ReadInt();
    for ( int i = 1; i <= N; ++i )
        Query[i] = ReadInt();

    for ( int i = 1; i < N; ++i ){
        x = ReadInt();
        y = ReadInt();
        Tata[y] = x;
        Arb[x].push_back(y);
    }

    int rad;
    for ( int i = 1; i <= N; ++i ){
        if ( Tata[i] == 0 ){
            rad = i;
            break;
        }
    }

    DFS( rad );

    for ( int i = 1; i <= N; ++i )
        fout << Sol[i] << " ";

    return 0;
}