Pagini recente » Cod sursa (job #2504012) | Cod sursa (job #3296667) | Cod sursa (job #2933646) | Cod sursa (job #653820) | Cod sursa (job #3351154)
#include <bits/stdc++.h>
#define ll long long
#pragma GCC optimize ("O3")
#define pb push_back
#define f first
#define s second
#define MOD 1000000007
#define pii pair <int, int>
using namespace std;
const ll INF = 1e18;
const int NMAX = 500009;
vector <int> st;
vector <int> up, ans;
vector <vector <int>> fii;
void doit (int node, int prev) {
if (up[node] != 0) ans[node] = 1 + ans[st[st.size() - up[node]]];
else ans[node] = 0;
st.pb(node);
for (auto v : fii[node]) doit(v, node);
st.pop_back();
return;
}
bitset<100009> vis;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
ifstream cin ("cerere.in");
ofstream cout ("cerere.out");
int n; cin >> n;
up.resize(n + 2, 0); ans.resize(n + 2, 0);
fii.resize(n + 2);
for (int i = 1; i <= n; i ++) {
int x; cin >> x; up[i] = x;
}
for (int i = 1; i < n; i ++) {
int u, v; cin >> u >> v;
fii[u].pb(v);
vis[v] = 1;
}
int root = -1;
for (int i = 1; i <= n; i ++) if (vis[i] == 0) {root = i; break; }
doit(root, -1);
for (int i = 1; i <= n; i ++) cout << ans[i] << " ";
return 0;
}