Cod sursa(job #3365739)

Utilizator luca._.solosluca solos luca._.solos Data 23 septembrie 2026 12:53:11
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5, LOG = 17;

int N;
int k[MAXN + 1];
vector <int> adj[MAXN + 1];
int jump[MAXN + 1][LOG + 1];
int dp[MAXN + 1];
bool root[MAXN + 1];

void dfs(int u, int p) {
    jump[u][0] = p;
    for (int i = 1; i <= LOG; i++) {
        jump[u][i] = jump[jump[u][i - 1]][i - 1];
    }

    for (auto v : adj[u]) {
        dfs(v, u);
    }
}

int kth(int u, int K) {
    for (int i = LOG; i >= 0; i--) {
        if (K & (1 << i)) {
            u = jump[u][i];
        }
    }
    return u;
}

void dfs2(int u, int p) {
    if (!k[u]) {
        dp[u] = 0;
    }
    else {
        dp[u] = dp[kth(u, k[u])] + 1;
    }

    for (auto v : adj[u]) {
        dfs2(v, u);
    }
}

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

    fin >> N;
    for (int i = 1; i <= N; i++) {
        fin >> k[i];
    }
    for (int i = 1; i < N; i++) {
        int u, v;
        fin >> u >> v;
        adj[u].push_back(v);

        root[v] = 1;
    }
    for (int i = 1; i <= N; i++) {
        if (!root[i]) {
            dfs(i, 0);
            dfs2(i, 0);
        }
    }

    for (int i = 1; i <= N; i++) {
        fout << dp[i] << ' ';
    }
}