Pagini recente » Cod sursa (job #2141989) | Cod sursa (job #600982) | Cod sursa (job #428752) | Cod sursa (job #2858903) | Cod sursa (job #1538134)
#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;
}