use std::collections::VecDeque; use proconio::{input, marker::Usize1}; fn solve() -> u64 { input! { n: usize, s: [u64; n], ab: [(Usize1, Usize1); n - 1], } let mut g = vec![vec![]; n]; let mut d = vec![0; n]; for &(ai, bi) in ab.iter() { if s[ai] > s[bi] { g[bi].push(ai); d[ai] += 1; } else if s[ai] < s[bi] { g[ai].push(bi); d[bi] += 1; } } let mut ls = vec![0; n]; let mut q = VecDeque::new(); d.iter().enumerate().for_each(|(i, &di)| if di == 0 { q.push_back(i); ls[i] = s[i]; }); while let Some(cur) = q.pop_front() { for &nxt in g[cur].iter() { ls[nxt] = ls[nxt].max(ls[cur] + s[nxt]); d[nxt] -= 1; if d[nxt] == 0 { q.push_back(nxt); } } } *ls.iter().max().unwrap() } fn main() { let ans = solve(); println!("{}", ans); }