#include using namespace std; using ll=long long; template ll SZ(const T &a){ return a.size(); } constexpr ll N=200010; ll n,s,a[N]; vector T[N]; priority_queue pq[N]; void dfs(ll u){ ll son=0; for(ll v:T[u]){ T[v].erase(find(T[v].begin(),T[v].end(),u)); dfs(v); if(SZ(pq[v])>SZ(pq[son])){ son=v; } } if(son){ pq[u].swap(pq[son]); for(ll v:T[u]){ if(v!=son){ while(SZ(pq[v])){ pq[u].push(pq[v].top()); pq[v].pop(); } } } } ll o=1; while(1){ if(!SZ(pq[u])){ if(o>0){ pq[u].push(a[u]); } else{ s+=a[u]; } break; } if(pq[u].top()<=a[u]){ pq[u].push(a[u]); break; } a[u]-=pq[u].top(); pq[u].pop(); o=-o; if(SZ(pq[u])){ a[u]+=pq[u].top(); pq[u].pop(); o=-o; } } } int main(){ ios::sync_with_stdio(0),cin.tie(0); cin>>n; for(ll i=1;i<=n;i++){ cin>>a[i]; } for(ll i=1,u,v;i>u>>v; T[u].push_back(v); T[v].push_back(u); } dfs(1); ll ans=0,o=1; while(SZ(pq[1])){ ans+=o*pq[1].top(); pq[1].pop(); o=-o; } cout<