Cod sursa(job #2690482)

Utilizator pregoliStana Andrei pregoli Data 24 decembrie 2020 10:44:34
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>
#define STOP fout.close(); exit(0);
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
///***********************
const int NMAX = 1e5 + 3;
int n, v[NMAX], ans[NMAX], atLvl[NMAX], root;
bitset<NMAX> hasDad;
vector<int> edges[NMAX];

void read() {
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    for (int a, b, i = 1; i < n; i++) {
        fin >> a >> b;
        edges[a].push_back(b);
        hasDad[b] = true;
    }
}

void getRoot() {
    for (int i = 1; i <= n; i++)
        if (!hasDad[i]) {
            root = i;
            return;
        }
}

void dfs(int node, int lvl) {
    atLvl[lvl] = node;
    if (v[node])
        ans[node] = ans[atLvl[lvl - v[node]]] + 1;

    for (int it : edges[node])
        dfs(it, lvl + 1);
}

void display() {
    for (int i = 1; i <= n; i++)
        fout << ans[i] << ' ';
}

int main() {
    read();
    getRoot();
    dfs(root, 1);
    display();
    STOP
}