Pagini recente » Diferente pentru runda/w1 intre reviziile 18 si 14 | Istoria paginii utilizator/rusepetru | Monitorul de evaluare | Istoria paginii utilizator/raptorv | Cod sursa (job #1036171)
#include <cstdio>
#include <vector>
using namespace std;
const int NMAX = 100010;
vector <int> V[NMAX];
int a[NMAX], tata[NMAX], st[NMAX], sol[NMAX];
bool viz[NMAX];
int main(){
freopen( "cerere.in", "r", stdin );
int n;
scanf( "%d", &n );
for( int i = 1; i <= n; ++i )
scanf( "%d", &a[i] );
long long sum = 0, m = n;
for( int i = 1; i < n; ++i ){
int x, y;
scanf( "%d %d", &x, & y );
V[x].push_back( y );
tata[y] = x;
sum += y;
}
fclose( stdin );
int rad = m*(m+1)/2 - sum;
int k = 1;
st[1] = rad, viz[rad] = 1;
while( k > 0 ){
bool e = false;
int x = V[st[k]].size();
for( int i = 0; i < x && !e; ++i ){
int y = V[st[k]][i];
if( !viz[y] ){
e = true;
st[++k] = y;
viz[y] = 1;
}
}
if( !e ) --k;
else {
if( a[st[k]] != 0 ){
int nr = 0, aux = k, nod = st[k];
while( a[nod] !=0 && aux > 0 ){
++nr;
aux = aux - a[nod];
nod = st[aux];
}
sol[ st[k] ] = nr;
}
}
}
freopen( "cerere.out", "w", stdout );
for( int i = 1; i <= n; ++i )
printf( "%d ", sol[i] );
fclose( stdout );
return 0;
}