Cod sursa(job #3311329)

Utilizator prodsevenStefan Albu prodseven Data 21 septembrie 2025 12:24:28
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

ifstream cin("cerere.in");
ofstream cout("cerere.out");

int n;
vector<int> v, ans, node_at_depth;
vector<vector<int>> graf;
bitset<100001> root, viz;

void dfs(int node, int depth) {
    viz[node] = 1;
    node_at_depth.push_back(node);
    ans[node] = 1 + ans[node_at_depth[depth - v[node]]];
    for (int neighbor : graf[node]) {
        if (!viz[neighbor]) dfs(neighbor, depth + 1);
    }
    node_at_depth.pop_back();
}

int main() {
    cin >> n;
    v.resize(n + 2);
    root.set();
    graf.resize(n + 2);
    ans.resize(n + 2, -1);
    for (int i = 1 ; i <= n ; ++i) {
        cin >> v[i];
    }
    for (int i = 1 ; i <= n - 1 ; ++i) {
        int src, dest;
        cin >> src >> dest;
        graf[src].push_back(dest);
        graf[dest].push_back(src);
        root[dest] = 0;
    }

    for (int i = 1 ; i <= n ; ++i) {
        if (root[i]) {
            dfs(i, 0);
            break;
        }
    }

    for (int i = 1 ; i <= n ; ++i) {
        cout << ans[i] << " ";
    }

    return 0;
}