悬棺
WA#11
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[16001],f[16001][2];
bool v[16001];
vector<int> g[16001];
void dfs(int i){
f[i][1]=a[i];
f[i][0]=0;
for(int j=0;j<g[i].size();j++){
int k=g[i][j];
dfs(k);
f[i][0]+=f[k][0];
f[i][1]+=max(f[k][0],f[k][1]);
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
v[x]=1;
g[y].push_back(x);
}
int root=1;
while(v[root]==1) root++;
dfs(root);
for(int i=1;i<=n;i++){
cout<<f[i][0]<<" "<<f[i][1]<<"\n";
}
cout<<max(f[root][1],f[root][0]);
return 0;
}