#include <bits/stdc++.h>
using namespace std;
int tc;
vector<int> g[100500];
vector<int> ch[100500];
int n;
int was[100500];
int up[100500];
int sum[100500];
int a[100500];
int b[100500];
int jmp[100500][18];
int h[100500];
int parent[100500];
int dist[100500];
int m[100500][2];
int e[100500][2];
long long ans;
int precalc[100500][18];
void dfs(int v, int from) {
  sum[v] = 1;
  for (int w : g[v]) {
    if (w == from || was[w]) continue;
    dfs(w, v);
    sum[v] += sum[w];
  }
}
void dfs0(int v, int from) {
  parent[v] = from;
  jmp[v][0] = from;
  h[v] = h[from] + 1;
  for (int i = 1; i < 18; ++i) jmp[v][i] = jmp[jmp[v][i - 1]][i - 1];
  for (int w : g[v]) {
    if (w == from) continue;
    dfs0(w, v);
  }
}
int go(int x, int k) {
  for (int i = 0; i < 18; ++i)
    if ((k >> i) & 1) x = jmp[x][i];
  return x;
}
int lca(int x, int y) {
  if (h[x] > h[y]) swap(x, y);
  y = go(y, h[y] - h[x]);
  if (x == y) return x;
  for (int i = 18 - 1; i >= 0; --i)
    if (jmp[x][i] != jmp[y][i]) {
      x = jmp[x][i];
      y = jmp[y][i];
    }
  return jmp[x][0];
}
void rec(int v, int from) {
  dfs(v, from);
  if (sum[v] == 1) {
    up[v] = from;
    was[v] = true;
    ch[from].push_back(v);
    return;
  }
  int total, after, before, mx;
  total = sum[v];
  before = from;
  while (true) {
    mx = 0;
    for (int w : g[v]) {
      if (was[w] || w == before) continue;
      if (mx < sum[w]) {
        mx = sum[w];
        after = w;
      }
    }
    mx = max(mx, total - sum[v]);
    if (mx * 2 <= total) {
      was[v] = true;
      up[v] = from;
      ch[from].push_back(v);
      for (int w : g[v]) {
        if (!was[w]) rec(w, v);
      }
      return;
    }
    before = v;
    v = after;
  }
}
void calc(int v, int from) {
  dist[v] = dist[from] + b[v];
  for (int w : g[v]) {
    if (w != from) calc(w, v);
  }
}
int calc_way(int x, int y) { return dist[y] - dist[parent[x]]; }
int calc_path(int x, int y) {
  int z = lca(x, y);
  return calc_way(z, x) + calc_way(z, y) - b[z];
}
int calc_path2(int x, int y, int z) {
  return calc_way(z, x) + calc_way(z, y) - b[z];
}
int main() {
  scanf("%i", &n);
  for (int i = 1; i <= n; ++i) scanf("%i", &a[i]);
  for (int i = 1; i < n; ++i) {
    int x, y;
    scanf("%i%i", &x, &y);
    g[x].push_back(y);
    g[y].push_back(x);
  }
  dfs0(1, 0);
  rec(1, 0);
  for (int j = 1; j <= n; ++j) {
    int v = up[j];
    int i = 0;
    while (v != 0) {
      precalc[j][i] = lca(j, v);
      v = up[v];
      i++;
    }
  }
  for (int i = 0; i < 20; ++i) {
    for (int j = 1; j <= n; ++j) {
      b[j] = (a[j] >> i) & 1;
      m[j][0] = m[j][1] = 0;
      e[j][0] = e[j][1] = 0;
    }
    calc(1, 0);
    for (int j = 1; j <= n; ++j) {
      int v = up[j];
      int before = j;
      int z = 0;
      while (v != 0) {
        int d = calc_path2(j, v, precalc[j][z]);
        m[v][d % 2]++;
        e[before][d % 2]++;
        before = v;
        v = up[v];
        z++;
      }
      if (b[j]) ans += (1 << i);
    }
    long long tmp = 0;
    for (int j = 1; j <= n; ++j) {
      if (b[j]) {
        for (int w : ch[j]) {
          tmp += e[w][0] * (m[j][0] - e[w][0]);
          tmp += e[w][1] * (m[j][1] - e[w][1]);
        }
      } else {
        for (int w : ch[j]) {
          tmp += e[w][0] * (m[j][1] - e[w][1]);
          tmp += e[w][1] * (m[j][0] - e[w][0]);
        }
      }
      tmp += m[j][1] * 2;
    }
    ans += tmp / 2 * (1 << i);
  }
  cout << ans << endl;
  return 0;
}
