#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int n;
int a[200001];
int t[200001], sz[200001];
int nxt[200001], to[200001], fir[200001], ecnt = 0;
void add_edge(int u, int v) {
  nxt[++ecnt] = fir[u];
  to[ecnt] = v;
  fir[u] = ecnt;
}
void remove(int u, int v) {
  if (to[fir[u]] == v) {
    fir[u] = nxt[fir[u]];
    return;
  }
  for (int i = fir[u]; i; i = nxt[i])
    if (to[nxt[i]] == v) {
      nxt[i] = nxt[nxt[i]];
      return;
    }
}
void prevs(int u, int pre, int& cur) {
  cur++;
  sz[u] = 1;
  for (int i = fir[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v != pre) t[v] = u, prevs(v, u, cur), sz[u] += sz[v];
  }
}
long long res = 0;
int d[200001], on[21], off[21];
vector<int> ds;
void dfs(int u, int pre) {
  ds.emplace_back(d[u] = d[pre] ^ a[u]);
  for (int i = fir[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v != pre) dfs(v, u);
  }
}
void solve(int u, int pre) {
  memset(on, 0, sizeof(on));
  memset(off, 0, sizeof(off));
  int cur_sz = 0;
  prevs(u, pre, cur_sz);
  while (1) {
    int cand = -1;
    for (int i = fir[u]; i; i = nxt[i]) {
      int v = to[i];
      if (v == pre) continue;
      if (sz[v] > cur_sz / 2) cand = v;
    }
    if (cand != -1)
      pre = u, u = cand;
    else
      break;
  }
  d[u] = 0;
  res += a[u];
  for (int s = fir[u]; s; s = nxt[s]) {
    int v = to[s];
    ds.clear();
    dfs(v, u);
    for (int dist : ds) {
      int cur = dist ^ a[u];
      res += cur;
      for (int i = 0; i <= 20; i++)
        if (cur & (1 << i))
          res += (long long)off[i] * (1 << i);
        else
          res += (long long)on[i] * (1 << i);
    }
    for (int dist : ds)
      for (int i = 0; i <= 20; i++)
        if (dist & (1 << i))
          on[i]++;
        else
          off[i]++;
  }
  for (int i = fir[u]; i; i = nxt[i]) {
    int v = to[i];
    remove(v, u), solve(v, u);
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 2; i <= n; i++) {
    int u, v;
    cin >> u >> v;
    add_edge(u, v);
    add_edge(v, u);
  }
  solve(1, -1);
  cout << res;
}
