#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const double eps = 1e-9;
inline int read() {
  int ret = 0, sgn = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') sgn = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    ret = ret * 10 + ch - '0';
    ch = getchar();
  }
  return ret * sgn;
}
long long ksm(long long a, long long b, long long modk) {
  long long ans = 1;
  while (b) {
    if (b & 1) ans = (ans * a % modk + modk) % modk;
    a = a * a % modk + modk;
    a %= modk;
    b = b >> 1;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
const long long maxn = 2e5 + 7;
vector<int> g[maxn];
queue<int> dl;
int clr[maxn];
int du[maxn];
bool vis[maxn];
int fa[maxn];
long long ans[maxn];
int n;
long long dfs(int p) {
  int x = g[p].size();
  long long sum = 0;
  for (int i = 0; i < x; i++) {
    int v = g[p][i];
    if (fa[v] == -1 && v != 1) {
      fa[v] = p;
      long long temp = dfs(v);
      if (temp > 0) sum += temp;
    }
  }
  if (clr[p])
    sum = sum + 1;
  else
    sum -= 1;
  ans[p] = sum;
  return sum;
}
int main() {
  memset(fa, -1, sizeof(fa));
  cin >> n;
  for (int i = 1; i <= n; i++) scanf("%d", &clr[i]);
  int u, v;
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
    du[u]++;
    du[v]++;
  }
  ans[1] = dfs(1);
  dl.push(1);
  while (!dl.empty()) {
    int p = dl.front();
    dl.pop();
    int x = g[p].size();
    for (int i = 0; i < x; i++) {
      int v = g[p][i];
      if (fa[v] == p) {
        dl.push(v);
        if (ans[p] > 0) {
          if (ans[v] > 0 && ans[v] < ans[p])
            ans[v] = ans[p];
          else if (ans[v] <= 0)
            ans[v] += ans[p];
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) cout << ans[i] << " ";
  return 0;
}
