Cod sursa(job #1064613)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 22 decembrie 2013 02:21:23
Problema Cerere Scor 5
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 0.8 kb
#include<cstdio>

using namespace std;

const int NMAX = 100005;

int N;
int K[NMAX];
int Sol[NMAX];
int T[NMAX][18];

int afla(int x)
{
    if(Sol[x] || K[x]==0) return Sol[x];
    int i,j=x;
    for(i=0;(1<<i)<=K[x];i++)
    {
        if((K[x] & (1<<i)) == 0) continue;
        j=T[j][i];
    }
    Sol[x] = Sol[j] + 1;
    return Sol[x];
}

int main()
{
    int i,j,a,b;
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    scanf("%d",&N);
    for(i=1;i<=N;i++)
        scanf("%d",&K[i]);
    for(i=1;i<=N-1;i++)
    {
        scanf("%d%d",&a,&b);
        T[b][0]=a;
    }
    for(i=1;(1<<i)<=N;i++)
        for(j=1;j<=N;j++)
            T[j][i]=T[T[j][i-1]][i-1];
    for(i=1;i<=N;i++)
    {
        printf("%d ",afla(i));
    }
    return 0;
}