use itertools::Itertools; use proconio::{input, marker::Usize1}; fn main() { input! { n: usize, s: [usize; n], edges: [(Usize1, Usize1); n - 1], } let mut graph = vec![vec![]; n]; for &(u, v) in &edges { if s[u] < s[v] { graph[u].push(v); } else if s[u] > s[v] { graph[v].push(u); } } let order = (0..n).sorted_unstable_by_key(|&v| s[v]).collect_vec(); let mut dp = vec![0; n]; let mut ans = 0; for &v in order.iter().rev() { dp[v] = s[v] + graph[v].iter().map(|&u| dp[u]).max().unwrap_or(0); ans = ans.max(dp[v]); } println!("{ans}"); }