Cod sursa(job #2147473)

Utilizator flibiaVisanu Cristian flibia Data 28 februarie 2018 19:27:29
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.74 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>

using namespace std;

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

int n, nr[100100], dp[100100], st[100100], vf, x, y, idx;
bool bad[100100], viz[100100];
vector <int> v[100100];

void dfs(int from){
	viz[from] = 1;
	st[++vf] = from;
	if(!nr[from])
		dp[from] = 0;
	else dp[from] = 1 + dp[st[vf - nr[from]]];
	for(auto to : v[from])
		if(!viz[to])
			dfs(to);
	vf--;
}

int main(){
	in >> n;
	for(int i = 1; i <= n; i++)
		in >> nr[i];
	for(int i = 1; i < n; i++){
		in >> x >> y;
		v[x].push_back(y);
		bad[y] = 1;
	}
	for(int i = 1; i <= n; i++)
		if(!bad[i])
			idx = i;
	dfs(idx);
	for(int i = 1; i <= n; i++)
		out << dp[i] << ' ';
	return 0;
}