Cod sursa(job #2066375)

Utilizator CammieCamelia Lazar Cammie Data 14 noiembrie 2017 22:31:35
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 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 tata[MAXN];
int dp[MAXN], nn, nr, stiva[MAXN];

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

    for (auto x : G[nod]) {
        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[v[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;
}