Cod sursa(job #3365699)

Utilizator amavutsiviatam-aulachitgaboriipetrusifilip amavutsiviata Data 23 septembrie 2026 10:32:43
Problema Cerere Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;

int st[maxn], dp[maxn], k[maxn], p[maxn], m;
vector<int> edges[maxn];

void dfs1(int nod) {
    st[++m] = nod;
    dp[nod] = st[m - k[nod]];
    for (int u : edges[nod]) {
        dfs1(u);
    }
    m--;
}

void dfs2(int nod) {
    if (dp[nod] == nod) dp[nod] = 0;
    else dp[nod] = dp[dp[nod]] + 1;
    for (int u : edges[nod]) {
        dfs2(u);
    }
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> k[i];
    }
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        edges[u].push_back(v);
        p[v] = u;
    } 
    int root = 0;
    for (int i = 1; i <= n; i++) if (!p[i]) root = i;
    dfs1(root);
    dfs2(root);
    for (int i = 1; i <= n; i++) cout << dp[i] << ' ';
    return 0;
}