#include #include #include #include #include int main() { using namespace std; using lint = long long; int n; cin >> n; vector s(n); for (auto &e : s) cin >> e; vector g(n, vector()); for (int i = 0; i < n - 1; ++i) { int a, b; cin >> a >> b; a--; b--; g[a].push_back(b); g[b].push_back(a); } const lint oo = 1e18; // [v]: v 以下 vector dp(n, -oo); auto chmax = [](auto &x, auto y) { x = max(x, y); }; auto dfs = [&](this auto self, int v) -> lint { if (dp[v] != -oo) return dp[v]; lint ans = s[v]; for (int nv : g[v]) { if (s[nv] > s[v]) { auto ansi = self(nv); chmax(ans, s[v] + ansi); } } return dp[v] = ans; }; lint ans = -oo; for (int i = 0; i < n; ++i) chmax(ans, dfs(i)); cout << ans << "\n"; }