Cod sursa(job #3365717)

Utilizator iuli_morariuIuli Morariu iuli_morariu Data 23 septembrie 2026 11:46:09
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <bits/stdc++.h>
#define in  fin
#define out fout

using namespace std;
const int NMAX = 1e5 + 5;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

vector<int> g[NMAX];
int sol[NMAX];
vector<int> past;
int k[NMAX];

void fa_dfs_pls(int nod, int f){
    if(k[nod] == 0) sol[nod] = 0;
    else sol[nod] = sol[ past[ past.size() - k[nod] ] ] + 1;
    past.push_back(nod);
    
    //cout << "nod = " << nod << " sol = " << sol[nod] << '\n';
    
    for(const int &x : g[nod]){
        if(x == f) continue;
        fa_dfs_pls(x, nod);
    }
    
    past.pop_back();
}

signed main()
{
    //in.tie(0); out.tie(0);
    //ios_base::sync_with_stdio(false);
    
    int n; in >> n;
    bool poate_root[n + 1];
    for(int i = 1; i <= n; i++){
        in >> k[i];
        poate_root[i] = 1;
    }
    
    for(int i = 1; i < n; i++){
        int x, y; in >> x >> y;
        poate_root[y] = 0;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int root = 1;
    for(int i = 1; i <= n; i++){
        if(poate_root[i]) root = i;
    }
    
    //cerr << "root = " << root << '\n';
    
    fa_dfs_pls(root, -1);
    
    for(int i = 1; i <= n; i++) out << sol[i] << " ";

    return 0;
}