Cod sursa(job #1538122)

Utilizator BLz0rDospra Cristian BLz0r Data 28 noiembrie 2015 15:49:54
Problema Cerere Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <cmath>
#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 D[LgMax][Nmax], Query[Nmax], Sol[Nmax];
vector < int > Arb[Nmax];

int GetStramos ( int nod, int anc ){

    for ( int i = 0; (1<<i) <= anc; ++i ){
        if ( anc & (1<<i) )
            nod = D[i][nod];
    }
    return nod;
}

void DFS ( int nod, int pred ){

    if ( Query[nod] != 0 )
        Sol[nod] = Sol[GetStramos( nod, Query[nod] )] + 1;

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

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 );
        D[0][y] = x;
        Arb[x].push_back(y);
        Arb[y].push_back(x);
    }

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

    int lg = log2(N);

    for ( int i = 1; i <= lg; ++i )
        for ( int j = 1; j <= N; ++j )
            D[i][j] = D[i-1][D[i-1][j]];

    DFS ( rad, 0 );

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

    return 0;
}