Pagini recente » Cod sursa (job #2809835) | Cod sursa (job #721493) | Cod sursa (job #820023) | Cod sursa (job #2190426) | Cod sursa (job #1232086)
#include <cstdio>
#include <assert.h>
#include <vector>
#define Nmax 100005
using namespace std;
int str[Nmax],tata[Nmax],N,dp[Nmax][30],sol[Nmax],Log2[30],put[Nmax];
vector <int> L[Nmax];
inline void RMQ()
{
int i,j;
for(i=1;i<=N;++i)
for(j=1;j<=20;++j)
dp[i][j]=dp[dp[i][j-1]][j-1];
}
inline int Stramos(int x, int y)
{
int p;
while(y>0)
{
p=Log2[y];
x=dp[x][p];
y-=put[p];
}
return x;
}
inline void PreCalcul()
{
int i;
put[0]=1;
for(i=1;i<=20;++i)
put[i]=put[i-1]*2;
Log2[1]=0;
for(i=2;i<Nmax;++i)
Log2[i]=Log2[i/2]+1;
}
inline void Dfs(int nod, int t)
{
vector <int> ::iterator it;
if(!str[nod])
sol[nod]=1;
else
sol[nod]=1+sol[Stramos(nod,str[nod])];
for(it=L[nod].begin();it!=L[nod].end();++it)
if(*it!=t)
Dfs(*it,nod);
}
int main()
{
int y,x,i,rad;
freopen ("cerere.in","r",stdin);
freopen ("cerere.out","w",stdout);
scanf("%d", &N);
for(i=1;i<=N;++i)
scanf("%d", &str[i]);
for(i=1;i<N;++i)
{
scanf("%d%d", &x,&y);
L[x].push_back(y); L[y].push_back(x);
tata[y]=x; dp[y][0]=x;
}
PreCalcul();
for(i=1;i<=N;++i)
if(!tata[i]) rad=i;
RMQ();
Dfs(rad,0);
for(i=1;i<=N;++i)
printf("%d ", sol[i]-1);
printf("\n");
return 0;
}