Cod sursa(job #1792470)

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

using namespace std;

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

const int NMAX = 1e5 + 1;

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

void dfs(int node) {
    stk[++cnt] = node;
    if (k[node]) {
        ans[node] = ans[stk[cnt - k[node]]] + 1;
    }
    else
        ans[node] = 0;
    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);
    for (int i = 1; i <= n; ++i) {
        fout << ans[i] << ' ';
    }
    return 0;
}