Pagini recente » Cod sursa (job #736901) | Cod sursa (job #2950089) | Cod sursa (job #2531361) | Cod sursa (job #1073004) | Cod sursa (job #2663092)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> g[100005];
bool viz[100005];
int stramos[20][100005];
int sol[100005];
int v[100005];
void dfs(int nod)
{
viz[nod]=1;
if(v[nod]==0)
sol[nod]=0;
else{
int pas=19;
int k=v[nod];
int nodd=nod;
while(k){
if(k>=(1<<pas)){
k-=(1<<pas);
nodd=stramos[pas][nodd];
}
pas--;
}
sol[nod]=sol[nodd]+1;
}
for(int i=0; i<g[nod].size(); i++)
if(viz[g[nod][i]]==0)
dfs(g[nod][i]);
}
int main()
{ freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int n,i,x,y,j;
scanf("%d", &n);
for(i=1; i<=n; i++)
scanf("%d", &v[i]);
for(i=1; i<n; i++){
scanf("%d%d", &x, &y);
g[x].push_back(y);
g[y].push_back(x);
stramos[0][y]=x;
}
for(i=1; i<20; i++)
for(j=1; j<=n; j++)
stramos[i][j]=stramos[i-1][stramos[i-1][j]];
dfs(1);
for(i=1; i<=n; i++)
printf("%d ", sol[i]);
return 0;
}