Cod sursa(job #2135008)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 18 februarie 2018 15:24:13
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <vector>

#define MAXN 100005

using namespace std;

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

vector <int> graph[MAXN];

int N, k[MAXN], g[MAXN], stiva[MAXN], nn, nr[MAXN];

inline void Read() {
    int x, y;

    fin >> N;

    for (int i = 1; i <= N; i++)
        fin >> k[i];

    for (int i = 1; i < N; i++) {
        fin >> x >> y;

        graph[x].push_back(y);
        g[y] = 1;
    }
}

inline int Calc(int num) {
    if (k[stiva[num]] == 0)
        return 0;
    return 1 + Calc(num - k[stiva[num]]);
}

inline void DFS() {
    int node = stiva[nn];
    nr[node] = Calc(nn);

    for (auto x : graph[node]) {
        stiva[++nn] = x;
        DFS();
    }
    nn--;
}

inline void Solve() {
    for (int i = 1; i <= N; i++) {
        if (!g[i]) {
            stiva[++nn] = i;
            DFS();
            break;
        }
    }

    for (int i = 1; i <= N; i++)
        fout << nr[i] << " ";
}

int main () {
    Read();
    Solve();

    fin.close(); fout.close(); return 0;
}