#include #include #include using namespace std; long long search(int u, const vector> &e, const vector &s, vector &searched, vector &ans) { searched[u] = true; long long res = 0; for (int v : e[u]) { if (s[u] >= s[v]) { continue; } if (searched[v]) { res = max(res, ans[v]); continue; } // cout << u + 1 << " " << v + 1 << endl; res = max(res, search(v, e, s, searched, ans)); } res += s[u]; // cout << u + 1 << ": " << res << endl; ans[u] = res; return res; } int main() { int n; cin >> n; vector s(n); vector> ss(n); for (int i = 0; i < n; i++) { cin >> s[i]; ss[i] = {s[i], i}; } sort(ss.begin(), ss.end()); vector> e(n); for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; e[a - 1].push_back(b - 1); e[b - 1].push_back(a - 1); } vector searched(n, false); long long ans = 0; vector v(n, 0); for (auto [l, r] : ss) { if (searched[r]) { continue; } ans = max(ans, search(r, e, s, searched, v)); } cout << ans << endl; }