Cod sursa(job #770351)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 22 iulie 2012 19:04:21
Problema Cerere Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#include <vector>

using namespace std;


const int N = 100005;

int n, x, y, top, radacina;
int k[N], sol[N], stack[N], viz[N], tata[N];
vector <int> fiu[N];

void df(int nod)
{
    //if(viz[nod])
        //return;
    stack[++top] = nod;
    if(k[nod] != 0)
        sol[nod] = sol[stack[top - k[nod]]] + 1;
    else sol[nod] = 0;
    //fprintf(stderr, "%d %d %d %d\n", nod, sol[nod], top, k[nod]);
    //stack[++top] = nod;
    for(int i = 0; i < fiu[nod].size(); ++i)
        df(fiu[nod][i]);
    --top; 
}

int main()
{
    freopen ("cerere.in", "r", stdin);
    freopen ("cerere.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &k[i]);
    for(int i = 1; i < n; ++i) {
        scanf("%d %d", &x, &y);
        fiu[x].push_back(y);
        tata[y] = x;
    }

    for(int i = 1; i <= n; ++i)
        if(tata[i] == 0) {
            radacina = i;
            break;
        }
    df(radacina);
    for(int i = 1; i <= n; ++i)
        printf("%d ", sol[i]);
}