#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
vector<pair<int, int> > g[(1 << 17)];
void foo(int);
int W[(1 << 17)];
int dfs(int u, int p) {
  W[u] = 1;
  for (auto &h : g[u])
    if (h.first ^ p) W[u] += dfs(h.first, u);
  return W[u];
}
int rot(int u, int S) {
  for (auto &h : g[u])
    if (W[h.first] > S - W[h.first] && W[h.first] < W[u])
      return rot(h.first, S);
  return u;
}
void cdc(int r = 0) {
  int S = dfs(r, -1), R = rot(r, S), a;
  foo(R);
  for (auto &h : g[R]) {
    for (auto &w : g[h.first])
      if (w.first == R) a = w.second, w = g[h.first].back();
    g[h.first].pop_back();
    cdc(h.first);
    g[h.first].push_back({a, R});
  }
}
long long S;
int N, A[(1 << 17)], a, b;
struct XR {
  int f[20], N;
  void add(int a) {
    for (int i(0); i < 20; i++)
      if (a & 1 << i) ++f[i];
    ++N;
  }
  void get(int a) {
    for (int i(0); i < 20; i++)
      S += (a & 1 << i ? N - f[i] : f[i]) * (1ll << i);
  }
  void clr() { (memset(f, N = 0, sizeof(f))); }
} X;
void dfs(int u, int p, int S) {
  X.get(S ^= A[u]);
  for (auto &h : g[u])
    if (h.first ^ p) dfs(h.first, u, S);
}
void add(int u, int p, int S) {
  X.add(S ^= A[u]);
  for (auto &h : g[u])
    if (h.first ^ p) add(h.first, u, S);
}
void foo(int r) {
  X.clr();
  for (auto &h : g[r]) dfs(h.first, r, A[r]), add(h.first, r, 0);
  X.get(A[r]), S += A[r];
}
int main(void) {
  scanf("%d", &N), ga(N, A);
  for (int i(0); i < N - 1; i++)
    scanf("%d%d", &a, &b), --a, --b,
        (g[a].push_back({b, 0}), g[b].push_back({a, 0}));
  cdc();
  printf("%lld\n", S);
  return 0;
}
