Pagini recente » Cod sursa (job #597217) | Cod sursa (job #2615649) | Cod sursa (job #2923286) | Cod sursa (job #2367877) | Cod sursa (job #1538122)
#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;
}