Cod sursa(job #1792456)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 30 octombrie 2016 14:49:33
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int NMAX = 1e5 + 1;

int n, root;
int k[NMAX], t[NMAX];
vector<int> v[NMAX];
int stk[NMAX], cnt, ans[NMAX];

void dfs(int node) {
    stk[++cnt] = node;
    ans[node] = stk[cnt - k[node]];
    for (const int& x: v[node]) {
        dfs(x);
    }
    --cnt;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; ++i)
        fin >> k[i];
    for (int i = 1, x, y; i < n; ++i) {
        fin >> x >> y;
        v[x].push_back(y);
        t[y] = x;
    }
    for (int i = 1; i <= n; ++i)
        if (t[i] == 0)
            root = i;
    dfs(root);
    int nr, curr;
    for (int i = 1; i <= n; ++i) {
        nr = 0;
        curr = i;
        while (k[curr]) {
            ++nr;
            curr = ans[curr];
        }
        fout << nr << ' ';
    }
    return 0;
}