Pagini recente » Cod sursa (job #2174134) | Cod sursa (job #879569) | Cod sursa (job #1248976) | Cod sursa (job #1120009) | Cod sursa (job #197078)
Cod sursa(job #197078)
#include<stdio.h>
#define N 100005
int n,k[N],g[N];
int a[N][21];
int loga[21]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144};
void citire()
{
int i,x,y;
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&k[i]);
for(i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
a[y][0]=x;
a[y][20]=1;
}
}
void precalc()
{
int i,cat=-1;
bool ok=true;
while(ok)
{
cat++;
ok=false;
for(i=1; i<=n; i++)
{
if(a[i][20]>cat)
{
if(a[a[i][cat]][20]>cat)
{
ok=true;
a[i][cat+1]=a[a[i][cat]][cat];
a[i][20]++;
}
}
}
}
}
int caut(int x)
{
int p=0,u=18,m;
while(p<u)
{
m=(p+u)>>1;
if(x<=loga[m])
u=m;
else
p=m+1;
}
if(loga[p]>x)
p--;
return p;
}
int afla(int care)
{
int acu=k[care],str=care,aux;
while(acu)
{
aux=caut(acu);
str=a[str][aux];
acu-=loga[aux];
}
return str;
}
void rezolva (int care)
{
int cati=0;
while(k[care])
{
cati++;
care=afla(care);
}
printf("%d ",cati);
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
citire();
precalc();
int i;
for(i=1; i<=n; i++)
rezolva(i);
printf("\n");
return 0;
}