Cod sursa(job #1392056)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 18 martie 2015 12:44:47
Problema Cerere Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#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]);
    }
}