Cod sursa(job #3352248)

Utilizator Andrei1209Andrei Mircea Andrei1209 Data 25 aprilie 2026 17:34:20
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.08 kb
///Varianta stramba(de testare)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int Nmax = 1e5 + 5;
vector <int> vecini[Nmax];
int k[Nmax], ans[Nmax], nivel[Nmax], hasParent[Nmax];
void dfs(int nod, int tata, int lvl )
{
    nivel[lvl] = nod;
    if ( k[nod] == 0  )
        ans[nod] = 0;
    else
        ans[nod] = ans[ nivel[  lvl - k[nod]  ] ] + 1;
    for ( int vecin : vecini[nod] )
    {
        if ( vecin == tata )
            continue;

        dfs( vecin, nod, lvl + 1);
    }
}
int main()
{
    int n, i;
    fin >> n;
    for ( i = 1; i <= n; ++i )
        fin >> k[i];

    for ( i = 1; i <= n - 1; ++i )
    {
        int a, b;
        fin >> a >> b;
        vecini[a].push_back(b);
        vecini[b].push_back(a);///aici
        hasParent[b] = true;
    }
    int root;
    for ( i = 1; i <= n; ++i )
        if ( hasParent[i] == false )
            root = i;
    dfs(root, -1, 1);

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