Cod sursa(job #3357014)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 4 iunie 2026 23:33:00
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector<int>values;
vector<vector<int>>tree;
vector<int>stackRec;
vector<int>answr;
int sizeStack=0;
void DFS(int crt, int parent) {
    if (values[crt] == 0 ) {
        answr[crt] = 0;
    }
    else if (sizeStack - values[crt] < 0) {
        answr[crt] = 1;
    }
    else {
        answr[crt] = 1+answr[stackRec[sizeStack - values[crt]]];
    }
    stackRec.push_back(crt);
    sizeStack++;
    for (auto i : tree[crt]) {
        if (i != parent) {
            DFS(i, crt);
        }
    }
    stackRec.pop_back();
    sizeStack--;
}
int main()
{
    int n;
    fin >> n;
    values.resize(n);
    tree.resize(n);
    answr.resize(n,-1);
    int root = 0;
    for (int i = 0; i < n; ++i) {
        fin >> values[i];
    }
    int u, v;
    vector<bool>hasParents(n);
    for (int i = 0; i < n - 1; ++i) {
        fin >> u >> v;
        --u;
        --v;
        tree[u].push_back(v);
        tree[v].push_back(u);
        hasParents[v] = 1;
    } 
    for (int i = 0; i < n; ++i) {
        if (!hasParents[i]) {
            root = i;
        }
    }
    DFS(root, -1);
    for (auto i : answr) {
        fout << i << " ";
    }
    return 0;
}