Pagini recente » Cod sursa (job #2053642) | Cod sursa (job #2108003) | Cod sursa (job #99521) | Cod sursa (job #1543115) | Cod sursa (job #2066375)
#include <fstream>
#include <vector>
#define MAXN 100005
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
vector <int> G[MAXN];
int parinte[MAXN], v[MAXN], k[MAXN], N, rad;
bool tata[MAXN];
int dp[MAXN], nn, nr, stiva[MAXN];
inline void DFS() {
int nod = stiva[nn];
v[++nr] = nod;
if (k[nod])
parinte[nod] = stiva[nn - k[nod]];
for (auto x : G[nod]) {
stiva[++nn] = x;
DFS();
}
nn--;
}
inline void Read() {
int a, b;
fin >> N;
for (int i = 1; i <= N; i++) {
fin >> k[i];
}
for (int i = 1; i <= N - 1; i++) {
fin >> a >> b;
G[a].push_back(b);
tata[b] = 1;
}
}
inline void Det_radacina() {
for (int i = 1; i <= N; i++)
if (!tata[i]) {
rad = i;
break;
}
}
inline void Dynamics() {
for (int i = 1; i <= N; i++) {
if (k[v[i]] == 0)
dp[v[i]] = 0;
else {
dp[v[i]] = 1 + dp[parinte[v[i]]];
}
}
}
inline void Write() {
for (int i = 1; i <= N; i++)
fout << dp[i] << " ";
}
int main () {
Read();
Det_radacina();
nr = 0;
stiva[nn] = rad;
DFS();
Dynamics();
Write();
fin.close(); fout.close(); return 0;
}