#include <bits/stdc++.h>
using namespace std;
const long long mod = (long long)1e9 + 7;
int n;
int a[500500];
long long cnt[30];
vector<int> g[500500];
int nn, centroid;
int tin[500500], tout[500500], val[500500], timer;
int up[30][500500];
void precalc(int v, int p, int xr) {
  xr ^= a[v];
  val[v] = xr;
  tin[v] = timer++;
  up[0][v] = p;
  for (int i = 1; i <= 20; ++i) up[i][v] = up[i - 1][up[i - 1][v]];
  for (int to : g[v]) {
    if (to == p) continue;
    precalc(to, v, xr);
  }
  tout[v] = timer++;
}
bool ancestor(int a, int b) { return tin[a] <= tin[b] && tout[a] >= tout[b]; }
int lca(int a, int b) {
  if (ancestor(a, b)) return a;
  if (ancestor(b, a)) return b;
  for (int i = 20; i >= 0; --i) {
    int d = up[i][a];
    if (d == 0) continue;
    if (!ancestor(d, b)) a = d;
  }
  return up[0][a];
}
int dist(int x, int y) {
  int z = lca(x, y);
  return val[x] ^ val[y] ^ a[z];
}
int sz[500500], U[500500];
void calc(int v, int p) {
  ++nn;
  sz[v] = 1;
  for (int to : g[v]) {
    if (to == p || U[to]) continue;
    calc(to, v);
    sz[v] += sz[to];
  }
}
int get_centroid(int v, int p) {
  for (int to : g[v]) {
    if (to == p || U[to] || sz[to] <= nn / 2) continue;
    return get_centroid(to, v);
  }
  return v;
}
long long cnt0, cnt1, c0, c1;
void dfs(int v, int p, int i) {
  int cur_dist = dist(centroid, v);
  int xor_value = 1;
  if (cur_dist & (1 << i)) {
    ++c1;
    xor_value ^= 1;
  } else {
    ++c0;
  }
  if (a[centroid] & (1 << i)) xor_value ^= 1;
  if (xor_value == 1)
    cnt[i] += cnt1;
  else
    cnt[i] += cnt0;
  for (int to : g[v]) {
    if (to == p || U[to]) continue;
    dfs(to, v, i);
  }
}
void decompose(int v, int p) {
  nn = 0;
  calc(v, 0);
  centroid = get_centroid(v, 0);
  U[centroid] = 1;
  for (int j = 0; j <= 20; ++j) {
    if (a[centroid] & (1 << j)) ++cnt[j];
    cnt0 = 0, cnt1 = 0;
    for (int i = 0; i < g[centroid].size(); ++i) {
      int to = g[centroid][i];
      if (U[to]) continue;
      c0 = 0, c1 = 0;
      dfs(to, 0, j);
      cnt0 += c0, cnt1 += c1;
    }
    cnt[j] += cnt1;
  }
  for (int to : g[centroid]) {
    if (U[to]) continue;
    decompose(to, centroid);
  }
}
int main() {
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    cin >> a >> b;
    g[a].emplace_back(b);
    g[b].emplace_back(a);
  }
  precalc(1, 0, 0);
  decompose(1, 0);
  long long ans = 0;
  for (int i = 0; i <= 20; ++i) ans += cnt[i] * (1ll << i);
  cout << ans << "\n";
  return 0;
}
