Cod sursa(job #932970)

Utilizator razvan.popaPopa Razvan razvan.popa Data 29 martie 2013 14:14:03
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include<cstdio>
#include<list>
#define pb push_back
#define nxt (*it)
#define FOR(i,a,b)\
   for(int i=a; i<=b; ++i)
#define ALL(g)\
   for(typeof(g.begin()) it=g.begin(); it!=g.end(); ++it)
#define infile "cerere.in"
#define outfile "cerere.out"
#define nMax 100005
using namespace std;

list < int > v[nMax];

int K[nMax], ST[nMax], Ans[nMax];

int R, T[nMax];

int N;

void read(){
    freopen(infile, "r", stdin);

    scanf("%d", &N);

    FOR(i,1,N)
       scanf("%d", &K[i]);

    int x, y;
    FOR(i,1,N-1){
       scanf("%d %d", &x, &y);
       v[x].pb(y);
       T[y] = x;

       if(!T[x])
          R = x;
    }

    fclose(stdin);
}

void DFS(int x){
    ST[++ST[0]] = x;

    if(K[x])
       Ans[x] = Ans[ST[ST[0] - K[x]]] + 1;

    ALL(v[x])
       DFS(nxt);

    ST[0] --;
}

void print(){
    freopen(outfile, "w", stdout);

    FOR(i,1,N)
       printf("%d ", Ans[i]);

    fclose(stdout);
}

int main(){
    read();
    DFS(R);
    print();

    return 0;
}