Pagini recente » Cod sursa (job #1112769) | Cod sursa (job #1001383) | Cod sursa (job #602648) | Cod sursa (job #2452684) | Cod sursa (job #1392056)
#include <stdio.h>
int n;
int dest[100001];
int rasp[100001];
int dp[100001][18];
int p2[18];
void gas(int i)
{
int x=i,y=dest[i];
if(rasp[i]==0) return;
for(int j=17;j>=0;j--)
{
if(p2[j]<=y)
{
x=dp[x][j];
y-=p2[j];
}
}
if(rasp[x]==-1)
{
gas(x);
}
rasp[i]=rasp[x]+1;
}
int main()
{
freopen ("cerere.in","r",stdin);
freopen ("cerere.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&dest[i]);
if(dest[i]!=0) rasp[i]=-1;
}
int px,py;
for(int i=1;i<n;i++)
{
scanf("%d%d",&px,&py);
dp[py][0]=px;
}
for(int i=1;i<=n;i++)
{
if(dp[i][0]==0) rasp[i]=0;
for(int j=1;j<=18;j++)
{
dp[i][j]=dp[dp[i][j-1]][j-1];
if(dp[i][j]==0) break;
}
}
for(int i=0;i<=17;i++) p2[i]=(1<<i);
for(int i=1;i<=n;i++)
{
if(rasp[i]==-1) gas(i);
printf("%d ",rasp[i]);
}
}