Cod sursa(job #3362159)

Utilizator Belea_DariusBelea Mihai Darius Belea_Darius Data 3 august 2026 18:52:57
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <bits/stdc++.h>
#define MAXN 1000000

using namespace std;

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

int is_root[MAXN + 1], ki[MAXN + 1], helper[MAXN + 1], not_stiva[MAXN + 1], mem[MAXN + 1], ind;

vector <int> graf[MAXN + 1];

void DFS(int nod){
    int vec, i;

    helper[nod] = not_stiva[ind - ki[nod]];

    for(i = 0; i < graf[nod].size(); i++){
        vec = graf[nod][i];
        not_stiva[++ind] = vec;
        DFS(vec);
        ind--;
    }
}

int calc(int i){
    if(mem[i] == -1){
        if(helper[i] == i){
            mem[i] = 0;
        }else{
            mem[i] = 1 + calc(helper[i]);
        }
    }
    return mem[i];
}

int main()
{
    int n, i, root, a, b;

    fin >> n;
    for(i = 1; i <= n; i++){
        fin >> ki[i];
    }

    for(i = 1; i < n; i++){
        fin >> a >> b;
        graf[a].push_back(b);
        is_root[b] = 1;
    }
    i = 1;
    while(is_root[i] == 1){
        i++;
    }
    root = i;
    ind = 1;
    not_stiva[ind] = root;
    DFS(root);

    for(i = 1; i <= n; i++){
        mem[i] = -1;
    }
    for(i = 1; i <= n; i++){
        fout << calc(i) << " ";
    }
    fout << "\n";
    return 0;
}