Pagini recente » Cod sursa (job #1309521) | Cod sursa (job #177309) | Cod sursa (job #499439) | Cod sursa (job #1438266) | Cod sursa (job #2346381)
#include <fstream>
#include <vector>
#define MAXN 100005
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector <int> st;
vector <int> graph[MAXN];
int N, lg, sol[MAXN], str[MAXN];
bool g_int[MAXN];
inline void Read() {
int x, y;
fin >> N;
for (int i = 1; i <= N; i++) {
fin >> str[i];
}
for (int i = 1; i < N; i++) {
fin >> x >> y;
graph[x].push_back(y);
g_int[y] = 1;
}
}
inline void DFS(int node) {
if (str[node] == 0)
sol[node] = 0;
else {
lg = st.size() - 1;
sol[node] = sol[st[lg - str[node]]] + 1;
}
for (auto x : graph[node]) {
st.push_back(x);
DFS(x);
st.pop_back();
}
}
inline void Solve() {
int root;
for (int i = 1; i <= N; i++) {
if (!g_int[i]) {
root = i;
break;
}
}
st.push_back(root);
DFS(root);
}
inline void Write() {
for (int i = 1; i <= N; i++)
fout << sol[i] << " ";
}
int main () {
Read();
Solve();
Write();
fin.close(); fout.close(); return 0;
}