Cod sursa(job #3364738)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 10 septembrie 2026 15:38:01
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMAX = 1e5 + 1;
int n, nr[NMAX], ans[NMAX], kth[NMAX], parent[NMAX];
vector<int> adj[NMAX];
int stk[NMAX], vf = 0, root = -1;
bool smart[NMAX];

void dfs(int node)
{
    stk[++vf] = node;
    kth[node] = stk[vf - nr[node]];
    ans[node] = (smart[node] ? 0 : 1 + ans[kth[node]]);
    for(int next : adj[node])
    {
        if(next == parent[node])
            continue;
        dfs(next);
    }
    vf--;
}

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++)
    {
        fin >> nr[i];
        smart[i] = (nr[i] == 0);
    }
    for(int i = 1; i <= n - 1; i++)
    {
        int u, v; fin >> u >> v;
        parent[v] = u;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(int i = 1; i <= n; i++)
        if(parent[i] == 0)
            root = i;
    smart[root] = true;
    dfs(root);
    for(int i = 1; i <= n; i++)
        fout << ans[i] << " ";

    fin.close();
    fout.close();
    return 0;
}