func_code_string: #include <bits/stdc++.h>   using namespace std;   const int32_t MOD = 1000000007;   struct WEdge {     int32_t u, v;     int w;     bool operator<(const WEdge& other) { return w < other.w; }     WEdge(int32_t u, int32_t v, int w) : u(u), v(v), w(w) {}     WEdge() {}     void in() { cin >> u >> v >> w; }     void trace() {       if (0) cout << u <<     << v <<     << w <<   n ;     }   };   struct Edge {     int32_t u, v;     Edge(int32_t u, int32_t v) : u(u), v(v) {}     void in() { cin >> u >> v; }   };   struct UnionSet {     map<int32_t, pair<int32_t, int32_t> > sets;     void makeSet(int32_t x) { sets.emplace(x, make_pair(x, 0)); }     void init(int32_t a, int32_t b) {       for (int x = (a); x < (b); ++x) makeSet(x);     }     int find(int32_t x) {       if (sets[x].first == x)         return x;       else         return sets[x].first = find(sets[x].first);     }     void union_both(int32_t x, int32_t y) {       int32_t parentX = find(x), parentY = find(y);       int32_t rankX = sets[parentX].second, rankY = sets[parentY].second;       if (parentX == parentY)         return;       else if (rankX < rankY)         sets[parentX].first = parentY;       else         sets[parentY].first = parentX;       if (rankX == rankY) sets[parentX].second++;     }   };   int32_t add(int32_t a, int32_t b) {     int32_t r = a + b;     if (r >= MOD) r -= MOD;     return r;   }   int32_t sub(int32_t a, int32_t b) {     int32_t r = a - b;     if (r < 0) r += MOD;     return r;   }   int32_t mul(int32_t a, int32_t b) { return (a * 1ll * b) % MOD; }   int32_t pow_mod(int32_t a, int64_t n) {     if (n == 0)       return 1;     else {       int32_t tmp = pow_mod(a, n / 2);       tmp = mul(tmp, tmp);       if (n % 2 == 0)         return tmp;       else         return mul(tmp, a);     }   }   int32_t fact_mod(int32_t n) {     int32_t r = 1;     for (int32_t k = 1; k <= n; k++) r = mul(r, k);     return r;   }   vector<int> children[200001];   int a[200001];   int64_t S[200001];   int64_t T[200001];   void dfs_init(int u, int pred) {     S[u] = a[u];     T[u] = 0;     for (auto v : children[u]) {       if (v != pred) {         dfs_init(v, u);         S[u] += S[v];         T[u] += T[v] + S[v];       }     }   }   int64_t M = -1;   void dfs_maxt(int u, int pred, int64_t sa, int64_t ta) {     M = max(M, ta + T[u]);     sa += a[u];     ta += sa;     int64_t ts = 0, tt = 0;     for (auto v : children[u]) {       if (v != pred) {         ts += S[v];         tt += 2ll * S[v] + T[v];       }     }     for (auto v : children[u]) {       if (v != pred) {         dfs_maxt(v, u, sa + ts - S[v], ta + tt - T[v] - 2ll * S[v]);       }     }   }   int32_t main() {     ios_base::sync_with_stdio(0);     int n;     cin >> n;     for (int i = (0); i < (n); ++i) cin >> (a + 1)[i];     int u, v;     for (int i = (0); i < (n - 1); ++i) {       cin >> u >> v;       children[u].push_back(v);       children[v].push_back(u);     }     dfs_init(1, -1);     dfs_maxt(1, -1, 0, 0);     cout << M <<   n ;   }   