Cod sursa(job #2205616)

Utilizator MateiTrandafirMatei Trandafir MateiTrandafir Data 19 mai 2018 17:01:03
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <fstream>
#define N 100001

int n, origin, v[N], k[N], start[N], item[N], next[N], count, current[N], c, r[N];

// a este tatal lui b
inline void add(int from, int to) {
    ++count;
    item[count] = to;
    next[count] = start[from];
    start[from] = count;
}

inline void dfs(int x) {
    ++c;
    current[c] = x;
    if (k[x] == 0) r[x] = 0;
    else r[x] = r[current[c - k[x]]] + 1;
    int p = start[x];
    while (p != 0) {
        dfs(item[p]);
        p = next[p];
    }
    --c;
}

int main() {
    std::ifstream in("cerere.in");
    std::ofstream out("cerere.out");
    int i, x, y;
    in >> n;
    for (i = 1; i <= n; ++i) {
        in >> k[i];
    }
    for (i = 1; i < n; ++i) {
        in >> x >> y;
        v[y] = 1;
        add(x, y);
    }
    for (i = 1; i <= n; ++i) {
        if (v[i] == 0) origin = i;
        else v[i] = 0;
    }
    k[origin] = 0;
    c = -1;
    dfs(origin);
    for (i = 1; i <= n; ++i) out << r[i] << ' ';
    return 0;
}