Pagini recente » Cod sursa (job #2118176) | Cod sursa (job #2228695) | Cod sursa (job #2602) | Cod sursa (job #2787407) | Cod sursa (job #2705575)
#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;
}