#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
bool compare(T x, U y) {
  return (abs(x - y) <= 1e-9);
}
const long long MOD = 1e9 + 7;
const long long N = 2e5 + 5;
vector<long long> adj[N];
vector<long long> vis(N);
vector<long long> in(N);
vector<long long> a(N);
vector<long long> out(N);
void dfs(long long s) {
  long long mx_val = 0;
  long long sum = 0;
  for (auto x : adj[s]) {
    if (!vis[x]) {
      vis[x] = 1;
      dfs(x);
      sum += max(0ll, in[x]);
    }
  }
  if (a[s])
    in[s] = sum + 1;
  else
    in[s] = sum - 1;
}
void dfs1(long long s) {
  for (auto x : adj[s]) {
    if (!vis[x]) {
      vis[x] = 1;
      out[x] = 0;
      if (in[x] >= 0) {
        long long rem = in[s] - in[x];
        out[x] =
            max(out[x],
                max({rem, rem + out[s], (a[s]) ? (out[s] + 1) : (out[s] - 1)}));
      } else {
        out[x] = max(out[x], max({in[s], in[s] + out[s],
                                  (a[s]) ? (out[s] + 1) : (out[s] - 1)}));
      }
      dfs1(x);
    }
  }
}
void solve() {
  long long n;
  cin >> n;
  for (long long i = 1; i <= n; i++) cin >> a[i];
  for (long long i = 1; i < n; i++) {
    long long a, b;
    cin >> a >> b;
    adj[a].push_back(b);
    adj[b].push_back(a);
  }
  vis[1] = 1;
  dfs(1);
  for (long long i = 1; i <= n; i++) vis[i] = 0;
  vis[1] = 1;
  dfs1(1);
  for (long long i = 1; i <= n; i++)
    cout << max({in[i], in[i] + out[i], out[i] + ((a[i]) ? 1 : -1)}) << " ";
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long t = 1;
  while (t--) {
    solve();
    cout << "\n";
  }
}
