Cod sursa(job #2705569)

Utilizator Ionut2791Voicila Ionut Marius Ionut2791 Data 12 februarie 2021 20:45:10
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <bits/stdc++.h>
#define fin cin
#define ll long long
#define sz(x) (int)(x).size()
#define debug(v,n) for (int i = 1; i <= (n); ++i) cout << v[i] << " ";
#define next cout << '\n'
using namespace std;

const int N = 1e5 + 5;
int n, k[N], ans[N], tree[N];
bool done[N];


int dfs(int nod, int adancime) {

    if(adancime == 0)
        return nod;

    return dfs(tree[nod], adancime - 1);
}

void solve(int nod) {
    if(k[nod] == 0 || done[nod]) // ans ramane 0
        return;
    done[nod] = true;

    int to = dfs(nod, k[nod]);
    solve(to);
    ans[nod] = ans[to] + 1;
}

int main() {
    //ifstream fin("date.in.txt");
    ifstream fin("cerere.in");
    ofstream fout("cerere.out");
    fin >> n;
    for (int i = 1; i <= n; ++i)
        fin >> k[i];

    for (int i = 1; i < n; ++i) {
        int a, b;
        fin >> a >> b;
        tree[b] = a;
    }

    for (int i = 1; i <= n; ++i) {
        if(done[i] == false)
            solve(i);
    }
    for (int i = 1; i <= n; ++i)
        fout << ans[i] << " ";

    return 0;
}