Cod sursa(job #2705575)

Utilizator Ionut2791Voicila Ionut Marius Ionut2791 Data 12 februarie 2021 21:28:32
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 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], root = -1, fr[N];
bool done[N];
vector<int> graf[N];


int dfs(int nod, int adancime) {
    if(adancime == 0)
        return nod;

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

void solve(int nod) {
    done[nod] = true;

    int to = dfs(nod, k[nod]);
    if(done[to] == false)
        solve(to);

    ans[nod] = ans[to] + 1;
}

void putFr(int nod) {
    for (int to : graf[nod]) {
        putFr(to);
        fr[nod] += fr[to] + 1;
    }
}

bool cmp(int a, int b) {
    return fr[a] > fr[b];
}

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;

        if(root == -1)
            root = a;
        graf[a].push_back(b);
    }
    putFr(root);
    vector<int> idx(n);
    iota(idx.begin(), idx.end(), 1);
    sort(idx.begin(), idx.end(), cmp);

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

    return 0;
}