Cod sursa(job #2979580)

Utilizator AndreiBadAndrei Badulescu AndreiBad Data 15 februarie 2023 16:37:34
Problema Cerere Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
//
//  main.cpp
//  Cerere (infoarena)
//
//  Created by Andrei Bădulescu on 15.02.23.
//

//#include <iostream>
#include <fstream>
#include <bitset>
//#include <vector>

using namespace std;

ifstream cin("cerere.in");
ofstream cout("cerere.out");

const int N = 100000;

bitset <N + 1> visited;
//vector <int> level[N + 1];

int cost[N + 1];
int master[N + 1];
int difficulty[N + 1];

int n;

int jumpFrom(int current) {
    int remaining = difficulty[current];

    while (remaining--) {
        current = master[current];
    }

    return current;
}

int ancestorCost(int node) {
    if (visited[node]) {
        return cost[node];
    }

    visited[node] = true;

    if (!difficulty[node]) {
        return 0;
    }

    cost[node] = ancestorCost(jumpFrom(node)) + 1;
    return cost[node];
}

int main() {
    cin >> n;

    for (auto i = 1; i <= n; i++) {
        cin >> difficulty[i];
    }

    for (auto i = 1; i < n; i++) {
        int x, y;
        cin >> x >> y;
        master[y] = x;
    }

    visited[0] = 0;

    for (auto i = 1; i <= n; i++) {
        ancestorCost(i);
    }

    for (auto i = 1; i <= n; i++) {
        cout << cost[i] << ' ';
    }

    return 0;
}