Cod sursa(job #2066371)

Utilizator CammieCamelia Lazar Cammie Data 14 noiembrie 2017 22:26:03
Problema Cerere Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <vector>

#define MAXN 100005

using namespace std;

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

vector <int> G[MAXN];

int parinte[MAXN], v[MAXN], k[MAXN], N, rad;
bool viz[MAXN], tata[MAXN];
int dp[MAXN], nn, nr, stiva[MAXN];

inline void DFS() {
    int nod = stiva[nn];
    viz[nod] = 1; v[++nr] = nod;
    if (k[nod])
        parinte[nod] = stiva[nn - k[nod]];

    for (auto x : G[nod]) {
        if (!viz[x]) {
            stiva[++nn] = x;
            DFS();
        }
    }

    nn--;
}

inline void Read() {
    int a, b;

    fin >> N;

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

    for (int i = 1; i <= N - 1; i++) {
        fin >> a >> b;

        G[a].push_back(b);
        tata[b] = 1;
    }
}

inline void Det_radacina() {
    for (int i = 1; i <= N; i++)
        if (!tata[i]) {
            rad = i;
            break;
        }
}

inline void Dynamics() {
    for (int i = 1; i <= N; i++) {
        if (k[v[i]] == 0)
            dp[i] = 0;
        else {
            dp[v[i]] = 1 + dp[parinte[v[i]]];
        }
    }
}

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

int main () {
    Read();
    Det_radacina();

    nr = 0;
    stiva[nn] = rad;

    DFS();
    Dynamics();
    Write();

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