Cod sursa(job #1087299)

Utilizator StanAndreiAndrei Stan StanAndrei Data 19 ianuarie 2014 11:06:08
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <stdio.h>
#include <list>
#define NMAX 100005

using namespace std;

int K[NMAX],A[NMAX],Q[NMAX],NR,N;
list<int> G[NMAX];
bool T[NMAX],viz[NMAX];

void read()
{
    int i,a,b;
    scanf("%d\n",&N);
    for (i=1;i<=N;i++) scanf("%d ",&K[i]);

    for (i=1;i<N;i++)
    {
        scanf("%d %d\n",&a,&b);
        G[a].push_back(b);
        T[b]=1;
    }
}

void dfs(int p)
{
    NR++;
    Q[NR]=p;
    A[p]=A[Q[NR-K[p]]]+1;

    list<int>:: iterator it;
    for (it=G[p].begin();it!=G[p].end();it++)
        dfs(*it);

    NR--;
}

void solve()
{
    int i,j;
    for (i=1;i<=N;i++)
        if (!T[i]){j=i;break;}
    dfs(j);
    for (i=1;i<=N;i++) printf("%d\n",A[i]-1);
}

int main()
{
    freopen ("cerere.in","r",stdin);
    freopen ("cerere.out","w",stdout);

    read();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}