Pagini recente » Cod sursa (job #3365732) | Cod sursa (job #3365729) | Cod sursa (job #3365737) | Cod sursa (job #3365739) | Cod sursa (job #3365717)
#include <bits/stdc++.h>
#define in fin
#define out fout
using namespace std;
const int NMAX = 1e5 + 5;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector<int> g[NMAX];
int sol[NMAX];
vector<int> past;
int k[NMAX];
void fa_dfs_pls(int nod, int f){
if(k[nod] == 0) sol[nod] = 0;
else sol[nod] = sol[ past[ past.size() - k[nod] ] ] + 1;
past.push_back(nod);
//cout << "nod = " << nod << " sol = " << sol[nod] << '\n';
for(const int &x : g[nod]){
if(x == f) continue;
fa_dfs_pls(x, nod);
}
past.pop_back();
}
signed main()
{
//in.tie(0); out.tie(0);
//ios_base::sync_with_stdio(false);
int n; in >> n;
bool poate_root[n + 1];
for(int i = 1; i <= n; i++){
in >> k[i];
poate_root[i] = 1;
}
for(int i = 1; i < n; i++){
int x, y; in >> x >> y;
poate_root[y] = 0;
g[x].push_back(y);
g[y].push_back(x);
}
int root = 1;
for(int i = 1; i <= n; i++){
if(poate_root[i]) root = i;
}
//cerr << "root = " << root << '\n';
fa_dfs_pls(root, -1);
for(int i = 1; i <= n; i++) out << sol[i] << " ";
return 0;
}