Pagini recente » Cod sursa (job #2636595) | Cod sursa (job #881155) | Cod sursa (job #2825132) | Cod sursa (job #31821) | Cod sursa (job #2979579)
//
// 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;
}
for (auto i = 1; i <= n; i++) {
cost[i] = 0;
}
visited[0] = 0;
for (auto i = 1; i <= n; i++) {
ancestorCost(i);
}
for (auto i = 1; i <= n; i++) {
cout << cost[i] << ' ';
}
return 0;
}