import std; void main () { int N = readln.chomp.to!int; auto S = readln.split.to!(int[]); auto a = new int[](N - 1); auto b = new int[](N - 1); foreach (i; 0 .. N - 1) { readln.read(a[i], b[i]); a[i]--, b[i]--; } // ループにはならない。降順でトポロジカル順を成す auto graph = new int[][](N); foreach (i; 0 .. N - 1) { graph[a[i]] ~= b[i]; graph[b[i]] ~= a[i]; } auto ord = iota(N).array; ord.sort!((a, b) => S[b] < S[a]); auto dp = new long[](N); foreach (i; ord) { foreach (to; graph[i]) { if (S[i] < S[to]) { dp[i] = max(dp[i], dp[to]); } } dp[i] += S[i]; } long ans = 0; foreach (i; 0 .. N) { ans = max(ans, dp[i]); } writeln(ans); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } }