#include using i64 = long long; using u64 = unsigned long long; using u32 = unsigned; using u128 = unsigned __int128; using i128 = __int128; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N; std::cin >> N; std::vector W(N); for (int i = 0; i < N; i++) { std::cin >> W[i]; } std::vector> adj(N); for (int i = 0; i < N - 1; i++) { int u, v; std::cin >> u >> v; u--; v--; adj[u].push_back(v); adj[v].push_back(u); } std::vector dp = W; // dp[i]为以i为结尾严格递增路径的最大权值和 // 因为节点之间的转移是严格的,所以这棵树其实是一个DAG // 得到拓扑序后,直接在拓扑序上dp std::vector fa(N); std::iota(fa.begin(), fa.end(), 0); std::sort(fa.begin(), fa.end(), [&](int x, int y){ return W[x] < W[y]; }); for (int u : fa) { for (int v : adj[u]) { if (W[v] > W[u]) { dp[v] = std::max(dp[v], dp[u] + W[v]); } } } i64 mx = 0; for (int i = 0; i < N; i++) { mx = std::max(mx, dp[i]); } std::cout << mx << '\n'; return 0; }