Cod sursa(job #963374)

Utilizator ericptsStavarache Petru Eric ericpts Data 17 iunie 2013 12:15:12
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAX_N = 100100;

vector<int> G[MAX_N];

int n;
int k[MAX_N];
int at[MAX_N];
int st[MAX_N];
int care[MAX_N];
int TT[MAX_N];

void dfs(int nod,int lvl)
{
    while(lvl >= 1){
        st[lvl] = nod;
        if(k[nod] == 0)
            care[nod] = 0;
        else{
            register int aux = lvl - k[nod];
            care[nod] = 1 + care[st[aux]];
        }
        if(at[nod] < G[nod].size()){
            nod = G[nod][at[nod]++];
            lvl++;
        }else{
            nod = TT[nod];
            lvl--;
        }
    }
}

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

    int i;
    scanf("%d",&n);
    for(i = 1 ; i <= n ; ++ i)
        scanf("%d",k+i);
    int x,y;
    for(i = 1 ; i < n ; ++ i){
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        TT[y] = x;
    }
    for(i = 1 ; i <= n ; ++ i)
        if(TT[i] == 0)
            break;
    dfs(i,1);
    for(i = 1 ; i <= n ; ++ i)
        printf("%d ",care[i]);
    return 0;
}