#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
using namespace std;
const int N = 1e5 + 7;
const int INF = 1e9 + 7;
int bg[N], sz[N], bit[32], total[32];
int a[N], d[N];
int n, c, s;
long long ans = 0;
vector<int> g[N];
void dfs(int v, int p = 0) {
  sz[v] = 1;
  bg[v] = 0;
  for (int to : g[v]) {
    if (!d[to] && to != p) {
      dfs(to, v);
      sz[v] += sz[to];
      bg[v] = max(bg[v], sz[to]);
    }
  }
}
int fc(int v) {
  queue<int> q;
  int c = sz[v];
  q.push(v);
  while (!q.empty()) {
    v = q.front();
    q.pop();
    for (int to : g[v]) {
      if (!d[to] && max(bg[to], c - sz[to]) < max(bg[v], c - sz[v])) {
        q.push(to);
        break;
      }
    }
  }
  return v;
}
void path(int v, int p, int sum) {
  ++c;
  sum ^= a[v];
  for (int j = 0; j <= 20; j++)
    if (sum & (1 << j)) bit[j]++;
  for (int to : g[v])
    if (!d[to] && to != p) path(to, v, sum);
}
void cd(int v = 1) {
  dfs(v);
  v = fc(v);
  c = 0;
  s = 0;
  memset(total, 0, sizeof(total));
  for (int to : g[v]) {
    if (!d[to]) {
      memset(bit, 0, sizeof(bit));
      path(to, v, 0);
      for (int j = 0; j <= 20; j++) {
        if (a[v] & (1 << j)) {
          ans -= (1 << j) * 1LL * (s - total[j]) * bit[j];
          ans -= (1 << j) * 1LL * (c - bit[j]) * total[j];
          ans += (1 << j) * 1LL * s * c;
          ans += (1 << j) * 1LL * (c - bit[j]);
        } else {
          ans += (1 << j) * 1LL * (s - total[j] + 1) * bit[j];
          ans += (1 << j) * 1LL * (c - bit[j]) * total[j];
        }
        total[j] += bit[j];
      }
      s += c;
      c = 0;
    }
  }
  d[v] = 1;
  for (int to : g[v])
    if (!d[to]) cd(to);
}
int main() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    ans += a[i];
  }
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    g[a].push_back(b);
    g[b].push_back(a);
  }
  cd();
  cout << ans;
}
