Cod sursa(job #3351154)

Utilizator postolacheepostolache postolachee Data 17 aprilie 2026 11:38:29
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>
#define ll long long
#pragma GCC optimize ("O3")
#define pb push_back
#define f first
#define s second
#define MOD 1000000007
#define pii pair <int, int>
using namespace std;

const ll INF = 1e18;
const int NMAX = 500009;

vector <int> st;
vector <int> up, ans;
vector <vector <int>> fii;

void doit (int node, int prev) {
    if (up[node] != 0) ans[node] = 1 + ans[st[st.size() - up[node]]];
    else ans[node] = 0;
    st.pb(node);

    for (auto v : fii[node]) doit(v, node);
    st.pop_back();
    return;
}

bitset<100009> vis;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

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

    int n; cin >> n;

    up.resize(n + 2, 0); ans.resize(n + 2, 0);
    fii.resize(n + 2);

    for (int i = 1; i <= n; i ++) {
        int x; cin >> x; up[i] = x;
    }

    for (int i = 1; i < n; i ++) {
        int u, v; cin >> u >> v;
        fii[u].pb(v);
        vis[v] = 1;
    }

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

    doit(root, -1);

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