Cod sursa(job #1538134)

Utilizator BLz0rDospra Cristian BLz0r Data 28 noiembrie 2015 16:02:25
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <vector>
using namespace std;

#define Nmax 100002
#define LgMax 18
#define LSB(x) ( (x) & -(x) )

FILE *f = fopen ( "cerere.in", "r" );
FILE *g = fopen ( "cerere.out", "w" );

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

int ind = 0;

void DFS ( int nod, int pred ){

    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 ){
        if ( *it != pred ){
            DFS ( *it, nod );
        }
    }

    ind--;
}

int main(){

    int N, x, y;

    fscanf ( f, "%d", &N );
    for ( int i = 1; i <= N; ++i )
        fscanf ( f, "%d", &Query[i] );

    for ( int i = 1; i < N; ++i ){
        fscanf ( f, "%d%d", &x, &y );
        Tata[y] = x;
        Arb[x].push_back(y);
        Arb[y].push_back(x);
    }

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

    DFS( rad, 0 );

    for ( int i = 1; i <= N; ++i )
        fprintf ( g, "%d ", Sol[i] );

    return 0;
}