#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 200000;
int n;
ll a[MAXN+1];
vector<int> adj[MAXN+1];
ll sz[MAXN+1]; // subtree sizes
ll distSum[MAXN+1]; // distSum[u] = sum of dist(u, i) over all i
ll ans = LLONG_MIN;
// First DFS: compute sz[u] and distSum[1]
ll totalDist1 = 0;
void dfs1(int u, int p, int depth) {
sz[u] = 1;
totalDist1 += depth;
for (int v : adj[u]) {
if (v == p) continue;
dfs1(v, u, depth+1);
sz[u] += sz[v];
}
}
// Second DFS: reroot to compute distSum[u] for all u
void dfs2(int u, int p) {
// record answer for u
ans = max(ans, a[u] * distSum[u]);
for (int v : adj[u]) {
if (v == p) continue;
// when moving root from u -> v:
// distSum[v] = distSum[u] - sz[v] + (n - sz[v])
distSum[v] = distSum[u] - sz[v] + (n - sz[v]);
dfs2(v, u);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 0; i < n-1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
// 1) Compute subtree sizes and totalDist1 = sum distances from 1
dfs1(1, 0, 0);
distSum[1] = totalDist1;
// 2) Reroot DP to fill distSum[u] for all u and track max cost
dfs2(1, 0);
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwoKY29uc3QgaW50IE1BWE4gPSAyMDAwMDA7CgppbnQgbjsKbGwgYVtNQVhOKzFdOwp2ZWN0b3I8aW50PiBhZGpbTUFYTisxXTsKbGwgc3pbTUFYTisxXTsgICAgICAgIC8vIHN1YnRyZWUgc2l6ZXMKbGwgZGlzdFN1bVtNQVhOKzFdOyAgIC8vIGRpc3RTdW1bdV0gPSBzdW0gb2YgZGlzdCh1LCBpKSBvdmVyIGFsbCBpCmxsIGFucyA9IExMT05HX01JTjsKCi8vIEZpcnN0IERGUzogY29tcHV0ZSBzelt1XSBhbmQgZGlzdFN1bVsxXQpsbCB0b3RhbERpc3QxID0gMDsKdm9pZCBkZnMxKGludCB1LCBpbnQgcCwgaW50IGRlcHRoKSB7CiAgICBzelt1XSA9IDE7CiAgICB0b3RhbERpc3QxICs9IGRlcHRoOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmICh2ID09IHApIGNvbnRpbnVlOwogICAgICAgIGRmczEodiwgdSwgZGVwdGgrMSk7CiAgICAgICAgc3pbdV0gKz0gc3pbdl07CiAgICB9Cn0KCi8vIFNlY29uZCBERlM6IHJlcm9vdCB0byBjb21wdXRlIGRpc3RTdW1bdV0gZm9yIGFsbCB1CnZvaWQgZGZzMihpbnQgdSwgaW50IHApIHsKICAgIC8vIHJlY29yZCBhbnN3ZXIgZm9yIHUKICAgIGFucyA9IG1heChhbnMsIGFbdV0gKiBkaXN0U3VtW3VdKTsKICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICBpZiAodiA9PSBwKSBjb250aW51ZTsKICAgICAgICAvLyB3aGVuIG1vdmluZyByb290IGZyb20gdSAtPiB2OgogICAgICAgIC8vIGRpc3RTdW1bdl0gPSBkaXN0U3VtW3VdIC0gc3pbdl0gKyAobiAtIHN6W3ZdKQogICAgICAgIGRpc3RTdW1bdl0gPSBkaXN0U3VtW3VdIC0gc3pbdl0gKyAobiAtIHN6W3ZdKTsKICAgICAgICBkZnMyKHYsIHUpOwogICAgfQp9CgppbnQgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKCiAgICBjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGNpbiA+PiBhW2ldOwogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuLTE7IGkrKykgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgfQoKICAgIC8vIDEpIENvbXB1dGUgc3VidHJlZSBzaXplcyBhbmQgdG90YWxEaXN0MSA9IHN1bSBkaXN0YW5jZXMgZnJvbSAxCiAgICBkZnMxKDEsIDAsIDApOwogICAgZGlzdFN1bVsxXSA9IHRvdGFsRGlzdDE7CgogICAgLy8gMikgUmVyb290IERQIHRvIGZpbGwgZGlzdFN1bVt1XSBmb3IgYWxsIHUgYW5kIHRyYWNrIG1heCBjb3N0CiAgICBkZnMyKDEsIDApOwoKICAgIGNvdXQgPDwgYW5zIDw8ICJcbiI7CiAgICByZXR1cm4gMDsKfQo=