Pagini recente » Cod sursa (job #2243286) | Cod sursa (job #2276773) | Cod sursa (job #1484634) | Cod sursa (job #649951) | Cod sursa (job #3311329)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
int n;
vector<int> v, ans, node_at_depth;
vector<vector<int>> graf;
bitset<100001> root, viz;
void dfs(int node, int depth) {
viz[node] = 1;
node_at_depth.push_back(node);
ans[node] = 1 + ans[node_at_depth[depth - v[node]]];
for (int neighbor : graf[node]) {
if (!viz[neighbor]) dfs(neighbor, depth + 1);
}
node_at_depth.pop_back();
}
int main() {
cin >> n;
v.resize(n + 2);
root.set();
graf.resize(n + 2);
ans.resize(n + 2, -1);
for (int i = 1 ; i <= n ; ++i) {
cin >> v[i];
}
for (int i = 1 ; i <= n - 1 ; ++i) {
int src, dest;
cin >> src >> dest;
graf[src].push_back(dest);
graf[dest].push_back(src);
root[dest] = 0;
}
for (int i = 1 ; i <= n ; ++i) {
if (root[i]) {
dfs(i, 0);
break;
}
}
for (int i = 1 ; i <= n ; ++i) {
cout << ans[i] << " ";
}
return 0;
}