Pagini recente » Cod sursa (job #2132462) | Cod sursa (job #688582) | Cod sursa (job #903276) | Cod sursa (job #330214) | Cod sursa (job #2963301)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
constexpr size_t LIM = 1e5 + 1;
int N, i, node1, node2, K[LIM], father[LIM];
int id[LIM], ans[LIM];
vector<int> adj_list[LIM];
bool not_root[LIM];
static void dfs(int node, int level) {
id[level] = node;
if (K[node] == 0) ans[node] = 0;
else ans[node] = ans[id[level - K[node]]] + 1;
for (const int adj : adj_list[node])
dfs(adj, level + 1);
}
int main() {
fin >> N;
for (i = 1; i <= N; ++i)
fin >> K[i];
for (i = 1; i <= N; ++i) {
fin >> node1 >> node2;
adj_list[node1].push_back(node2);
not_root[node2] = true;
}
int root = 0;
for (i = 1; i <= N && !root; ++i)
if (!not_root[i]) root = i;
dfs(root, 1);
for (i = 1; i <= N; ++i)
fout << ans[i] << ' ';
fin.close();
fout.close();
return 0;
}