Cod sursa(job #6629)

Utilizator mariusdrgdragus marius mariusdrg Data 20 ianuarie 2007 13:30:35
Problema Cerere Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<stdio.h>


const int maxn = 100010;
const int maxn2 = 50;

int k[maxn];
int mat[maxn2][maxn];
int i,j;
int n;
int x;
int p;
int y;
int nr[maxn];
int f;
int k1;



int main()
{
        freopen("cerere.in","r",stdin);
        freopen("cerere.out","w",stdout);
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
                scanf("%d",&k[i]);
        }
        for(j=1; j <= n-1; ++j)
        {
                scanf("%d %d",&x,&y);
                mat[0][y]=x;
        }
        for(p = 2, i = 1; p <= n; p<<=1 )
        {
                for( j = 1; j <= n; j++ )
                {
                        mat[i][j] = mat[i-1][mat[i-1][j]];
                }
        }
        for( i = 1; i <= n; i++)
        {
                f=i;
                while(k[f])
                {
                        if (f<i)
                        {
                                nr[i]+=nr[f];
                                break;
                        }
                        nr[i]++;
                        x=k[f];

                        while ( x )
                        {
                                for(p=1, k1=0; p<=x ; ++k1, p<<=1);
                                p>>=1;
                                k1--;
                                x-=p;
                                f=mat[k1][f];
                        }
                }
                
                
        }

        for( i = 1; i <= n; i++)
        {
                printf("%d ", nr[i]);
        }
        printf("\n");


        return 0;
}