#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]; } ll x = a[u]; while (sz(pq[u]) && x < pq[u].top()) { x -= pq[u].top(); pq[u].pop(); if (!sz(pq[u])) { b[u] += x; return; } x += pq[u].top(); pq[u].pop(); } assert(x >= 0); pq[u].push(x); } 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"; }