#include #include using namespace std; #define rep(i, a, b) for (int i = (a); i <= (b); i++) #define sz(x) (int)(x).size() using ll = long long; const int kn = 2e5 + 10; int n; ll a[kn], b[kn]; __gnu_pbds::priority_queue pq[kn]; vector g[kn]; void dfs(int u, int fa) { for (int v : g[u]) { if (v == fa) continue; dfs(v, u); pq[u].join(pq[v]); b[u] += b[v]; } if (!sz(pq[u]) || a[u] > pq[u].top()) pq[u].push(a[u]); else { a[u] -= pq[u].top(), pq[u].pop(); if (sz(pq[u]) && a[u] + pq[u].top() > 0) { a[u] += pq[u].top(), pq[u].pop(); pq[u].push(a[u]); } else b[u] += a[u]; } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; rep (i, 1, n) cin >> a[i]; rep (i, 1, n - 1) { int u, v; cin >> u >> v; g[u].push_back(v), g[v].push_back(u); } dfs(1, 0); assert(b[1] <= 0); pq[1].push(b[1]); ll ans = 0; int phase = 0; while (sz(pq[1])) { if (phase == 0) ans += pq[1].top(); else ans -= pq[1].top(); pq[1].pop(); phase ^= 1; } cout << ans << "\n"; }