Pagini recente » Cod sursa (job #3003191) | Cod sursa (job #2928602) | Cod sursa (job #1493621) | Cod sursa (job #2701500) | Cod sursa (job #2485023)
#include <cstdio>
#include <vector>
int sol[100001], destepti[100001];
std::vector<int> edges[100001];
bool viz[100001], are_parinte[100001];
int st[100000], top;
void dfs(int i) {
viz[i] = true;
st[top++] = i;
if (destepti[i] > 0) {
sol[i] = sol[st[top - destepti[i] - 1]] + 1;
}
for (const auto fiu : edges[i]) {
dfs(fiu);
}
top--;
}
int main() {
FILE *fin = fopen("cerere.in", "r"),
*fout = fopen("cerere.out", "w");
int n;
fscanf(fin, "%d", &n);
for (int i = 1; i <= n; i++) {
fscanf(fin, "%d", &destepti[i]);
}
for (int i = 0; i < n - 1; i++) {
int a, b;
fscanf(fin, "%d%d", &a, &b);
edges[a].push_back(b);
are_parinte[b] = true;
}
int tati = 1;
while (tati <= n && are_parinte[tati] == true) {
tati++;
}
dfs(tati);
for (int i = 1; i <= n; i++) {
fprintf(fout, "%d ", sol[i]);
}
fclose(fin);
fclose(fout);
return 0;
}