Pagini recente » Clasament iiiiiiiiii | Cod sursa (job #1687433) | Cod sursa (job #272283) | Cod sursa (job #1723759) | Cod sursa (job #181646)
Cod sursa(job #181646)
# include <stdio.h>
# include <cstring>
# include <vector>
using namespace std;
# define input "cerere.in"
# define output "cerere.out"
# define max 100001
# define logmax 17
# define maxim(a,b) (a>b?a:b)
int i,j,n,maxk,k;
int x, y, tata;
int K[max],sz;
vector <int> v[max];
int grad[max];
int t[logmax][max];
int ret[max];
void df(int nod)
{
if(K[nod] == 0)
ret[nod] = 0;
else
{
int p = 0;
int tat = nod;;
for(int i = 1<<sz,j=sz; i; i>>=1,j--)
if(p + i <= K[nod])p += i,tat = t[j][tat];
ret[nod] = ret[tat]+1;
}
for(int i = 0; i < v[nod].size(); i++)
df(v[nod][i]);
}
int main()
{
freopen(input, "r", stdin);
freopen(output, "w", stdout);
scanf("%d",&n);
for(i = 1; i<= n; i++)
{
scanf("%d ",&K[i]);
maxk = maxim(maxk,K[i]);
}
for(i = 1; i < n; i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
t[0][y] = x;
grad[y]++;
}
for(i = 1;i <= n; i++)
if(!grad[i]) { tata = i; break; }
t[0][tata] = tata;
for(k = 1; (1<<k) <= maxk; k++)
for(i = 1; i<=n; i++)
{
t[k][i] = t[k-1][t[k-1][i]];
}
sz = k;
df(tata);
for( i = 1; i<=n ; i++)
printf("%d ",ret[i]);
return 0;
}