Pagini recente » Cod sursa (job #1023358) | Cod sursa (job #638497) | Cod sursa (job #2480347) | Cod sursa (job #1934088) | Cod sursa (job #1274535)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> g[100001];
int k[100001];
int st[100001];
int st_size = 0;
int sol[100001];
bool root[100001];
void dfs(int node)
{
st[++st_size] = node;
if (k[node] == 0)
sol[node] = 0;
else
sol[node] = sol[st[st_size - k[node]]] + 1;
for (int i = 0; i < g[node].size(); ++i)
dfs(g[node][i]);
st_size--;
}
int main()
{
FILE *in = fopen("cerere.in", "r");
FILE *out = fopen("cerere.out", "w");
int n;
fscanf(in, "%d", &n);
for (int i = 1; i <= n; ++i)
fscanf(in, "%d", &k[i]);
for (int x, y, i = 1; i < n; ++i)
{
fscanf(in, "%d%d", &x, &y);
g[x].push_back(y);
root[y] = 1;
}
for (int i = 1; i <= n; ++i)
if (!root[i])
dfs(i);
fprintf(out, "%d", sol[1]);
for (int i = 2; i <= n; ++i)
fprintf(out, " %d", sol[i]);
fprintf(out, "\n");
return 0;
}