#![allow(unused_imports)] fn main() { input! { n: usize, s: [u64; n], e: [(Usize1, Usize1); n-1], } let mut g = vec![vec![]; n]; let mut d = vec![0; n]; for (a, b) in e { if s[a] < s[b] { g[a].push(b); d[b] += 1; } if s[b] < s[a] { g[b].push(a); d[a] += 1; } } let mut dp = vec![0; n]; let mut que = VecDeque::new(); for (i, &d) in d.iter().enumerate() { if d == 0 { que.push_back(i); } } // eprintln!("{que:?}"); while let Some(v) = que.pop_front() { dp[v] += s[v]; for &u in &g[v] { chmax!(dp[u], dp[v]); d[u] -= 1; if d[u] == 0 { que.push_back(u); } } } println!("{}", dp.iter().max().unwrap()); } use proconio::{input, marker::*}; use itertools::{iproduct, izip, Itertools as _}; use std::{cmp::Reverse, collections::*}; #[macro_export] macro_rules! chmax { ($a:expr, $b:expr) => {{ let tmp = $b; if $a < tmp { $a = tmp; true } else { false } }}; } #[macro_export] macro_rules! chmin { ($a:expr, $b:expr) => {{ let tmp = $b; if $a > tmp { $a = tmp; true } else { false } }}; } #[macro_export] /// mvec![] macro_rules! mvec { ($val:expr; ()) => { $val }; ($val:expr; ($size:expr $(,$rest:expr)*)) => { vec![mvec![$val; ($($rest),*)]; $size] }; }