Cod sursa(job #2346381)

Utilizator andra_moldovanAndra Moldovan andra_moldovan Data 17 februarie 2019 16:45:50
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>
#include <vector>

#define MAXN 100005

using namespace std;

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

vector <int> st;
vector <int> graph[MAXN];

int N, lg, sol[MAXN], str[MAXN];
bool g_int[MAXN];

inline void Read() {
    int x, y;

    fin >> N;

    for (int i = 1; i <= N; i++) {
        fin >> str[i];
    }

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

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

inline void DFS(int node) {
    if (str[node] == 0)
        sol[node] = 0;
    else {
        lg = st.size() - 1;
        sol[node] = sol[st[lg - str[node]]] + 1;
    }

    for (auto x : graph[node]) {
        st.push_back(x);
        DFS(x);
        st.pop_back();
    }
}

inline void Solve() {
    int root;

    for (int i = 1; i <= N; i++) {
        if (!g_int[i]) {
            root = i;
            break;
        }
    }

    st.push_back(root);
    DFS(root);
}

inline void Write() {
    for (int i = 1; i <= N; i++)
        fout << sol[i] << " ";
}

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

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