Cod sursa(job #2657294)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 10 octombrie 2020 11:16:50
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.95 kb
//
//  main.cpp
//  cerere
//
//  Created by Eusbeiu Rares on 09/10/2020.
//  Copyright © 2020 Eusebiu Rares. All rights reserved.
//

#include <iostream>
#include "fstream"
#include "vector"

const int MV = 1e5 ;

std::fstream in ("cerere.in", std::ios::in) ;
std::fstream out ("cerere.out", std::ios::out) ;

using i64 = long long ;

int k[MV + 1] ;
int sol[MV + 1] ;
int solLvl[MV + 1] ;
std::vector<int> G[MV + 1] ;

void dfs(int node, int lvl) {
	if (k[node] == 0) {
		sol[node] = 0 ;
		solLvl[lvl] = 0 ;
	} else {
		sol[node] = solLvl[lvl - k[node]] + 1 ;
		solLvl[lvl] = sol[node] ;
	}
	for (auto it : G[node]) {
		dfs(it, lvl + 1) ;
	}
}

int main(int argc, const char * argv[]) {
	int n, i, A, B ;
	in >> n ;
	i64 rad(1LL * n * (n + 1) / 2) ;
	for (i = 1 ; i <= n ; ++ i) {
		in >> k[i] ;
	}
	for (i = 1 ; i <= n - 1 ; ++ i) {
		in >> A >> B ;
		G[A].push_back(B) ;
		rad -= B ;
	}
	dfs(rad, 1) ;
	for (i = 1 ; i <= n ; ++ i) {
		out << sol[i] << ' ' ;
	}
}