Cod sursa(job #3365737)

Utilizator luca._.solosluca solos luca._.solos Data 23 septembrie 2026 12:50:17
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 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];

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);
    }
    dfs(1, 0);
    dfs2(1, 0);

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