Cod sursa(job #2954258)

Utilizator rares89_Dumitriu Rares rares89_ Data 13 decembrie 2022 18:10:08
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

int n, x, y, k[100005], root, st[100005], ans[100005];
vector<int> G[100005];
bool v[100005];
// ans[i] = cate noduri trb vizitate pentru a rasp la cerere(1, 2, ..)
// st[i] = val maxima k[1..n] a nodurilor de pe nivelul i
// (in caz ca sunt 2 noduri cu val max, se ia cel mai din dreapta nod) 

void dfs(int nod, int nivel) {
    v[nod] = true;
    st[nivel] = nod;
    ans[nod] = ans[st[nivel - k[nod]]] + 1;
    for(auto i : G[nod]) {
        if(!v[i]) {
            dfs(i, nivel + 1);
        }
    }
}

int main() {
    fin >> n;
    for(int i = 1; i <= n; i++) {
        fin >> k[i];
    }
    for(int i = 1; i < n; i++) {
        fin >> x >> y;
        v[y] = true;
        G[x].push_back(y);
    }
    // gasesc rad arborelui
    for(int i = 1; i <= n; i++) {
        if(!v[i]) {
            root = i;
            break;
        }
    }
    memset(v, false, sizeof(v));
    dfs(root, 1);
    for(int i = 1; i <= n; i++) {
        fout << --ans[i] << " ";
    }
    return 0;
}