Pagini recente » Cod sursa (job #954102) | Cod sursa (job #1412072) | Cod sursa (job #1721994) | Cod sursa (job #2831204) | Cod sursa (job #3177954)
#include <fstream>
#include <vector>
#include <bitset>
std::ifstream fin("cerere.in");
std::ofstream fout("cerere.out");
const int nMax = 1e5 + 5;
std::bitset<nMax> not_root, used;
std::vector<int> path, graph[nMax];
int ancestor[nMax], ans[nMax];
void dfs(int node, int height) {
used[node] = 1;
path.emplace_back(node);
ans[node] = 1 + ans[path[height - ancestor[node]]];
for (int i : graph[node])
if (!used[node])
dfs(i, height + 1);
}
int main() {
int N;
fin >> N;
for (int i = 1; i <= N; i++) {
fin >> ancestor[i]; ans[i] = -1;
}
for (int i = 1; i < N; i++) {
int x, y;
fin >> x >> y;
not_root[y] = 1;
graph[x].emplace_back(y);
graph[y].emplace_back(y);
}
for (int i = 1; i <= N; i++)
if (!not_root[i])
{
dfs(i, 0);
break;
}
for (int i = 1; i <= N; i++)
fout << ans[i] << ' ';
fin.clear(); fout.clear();
return 0;
}