Cod sursa(job #3362142)

Utilizator MihaiDraghiciMIHAI DRAGHICI MihaiDraghici Data 3 august 2026 14:10:02
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

vector <int> k;
vector <vector<int>> arbore;
vector <int> ans;
vector <int> stack;

void dfs(int nod) {
	stack.push_back(nod);

	if (k[nod] == 0) {
		ans[nod] = 0;
	} else {
		int stramos = stack[stack.size() - 1 - k[nod]];
		ans[nod] = ans[stramos] + 1;
	}

	for (int i = 0; i < arbore[nod].size(); i++) {
		dfs(arbore[nod][i]);
	}

	stack.pop_back();
}

int main() {
	int n;
	fin >> n;

	k.resize(n + 1);
	arbore.resize(n + 1);
	ans.resize(n + 1);

	for (int i = 1; i <= n; i++) {
		fin >> k[i];
	}

	vector <int> tata(n + 1, 0);

	int a, b;
	for (int i = 1; i < n; i++) {
		fin >> a >> b;

		arbore[a].push_back(b);
		tata[b] = a;
	}

	int root = 1;

	for (int i = 1; i <= n; i++) {
		if (tata[i] == 0) {
			root = i;
			break;
		}
	}

	dfs(root);

	for (int i = 1; i <= n; i++) {
		fout << ans[i] << ' ';
	}
	fout << '\n';

	return 0;
}