Pagini recente » Cod sursa (job #821949) | Cod sursa (job #1259126) | Cod sursa (job #1270804) | Cod sursa (job #1473622) | Cod sursa (job #1007993)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#define pb push_back
using namespace std;
const int Nmax = 100005;
vector<int> G[ Nmax ];
int N,daddy[ Nmax ],stra[ Nmax ],root,D[ Nmax ];
int S[ Nmax ],top;
/*inline void scan(int &A)
{
char c = 0;A=0;
do
{
c = fgetc(stdin);
if('0'<=c && c<='9')
A=A*10+c-48;
}while('0'<=c && c<='9');
}*/
inline void read()
{
scanf("%d",&N);
int i,a,b;
for(i = 1 ; i <= N; ++i)
scanf("%d",&stra[ i ]);
for(i = 1 ; i < N; ++i){
scanf("%d%d",&a,&b);
G[a].pb(b);
daddy[b] = a;
}
for(i = 1; i <= N; ++i)
if(!daddy[i]) {
root = i;
break;
}
}
inline void DFS(int k)
{
S[++top] = k;
if(stra[k]) // vecinu'cautat se afla cu stra[k] mai putine poz in stiva
D[ k ] = D[ S[ top - stra[k] ] ] +1;
for(vector<int>::iterator it= G[k].begin();it!=G[k].end();++it)
DFS(*it);
-- top;
}
inline void solve()
{
DFS(root);
for(int i = 1; i <= N ; ++i)
printf("%d ",D[i]);
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
read();
solve();
return 0;
}