Cod sursa(job #3360039)

Utilizator serbanbBrindescu Serban serbanb Data 8 iulie 2026 11:46:32
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <vector>

using namespace std;

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

struct node
{
    vector<int> sons;
    int x, val;
    bool isRoot = true;
};

int n;
node tree[100005];
int root;
vector<int> st;

void read()
{
    fin >> n;
    for(int i = 1; i <= n; ++i){
        int a;
        fin >> a;
        tree[i].x = a;
        if(a == 0){
            tree[i].val = 0;
        }
    }
    for(int i = 1; i < n; ++i){
        int A,B;
        fin >> A >> B;
        tree[A].sons.push_back(B);
        tree[B].isRoot = false;
    }
    for(int i = 1; i <= n; ++i){
        if(tree[i].isRoot){
            root = i;
            break;
        }
    }
}

void dfs(int node)
{
    st.push_back(node);
    tree[node].val = tree[st[st.size() - 1 - tree[node].x]].val + 1;
    for(int i = 0; i < tree[node].sons.size(); ++i){
        dfs(tree[node].sons[i]);
    }
    st.pop_back();
}

int main()
{
    read();
    dfs(root);
    for(int i = 1; i <= n; ++i){
        fout << tree[i].val - 1 << ' ';
    }
    return 0;
}