#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[100010];
vector<int> g[100010];
char used_centroid[100010];
int sz[100010];
int cnt = 0;
long long an = 0;
int c1[100010];
int c[20][2];
void dfs(int v, int par, int sum, int centroid) {
  an += sum;
  if (v != centroid) {
    c1[v] = sum;
    int t = sum ^ a[centroid];
    for (int i = 0; i < 20; i++) {
      if (t & (1 << i))
        c[i][1]++;
      else
        c[i][0]++;
    }
  }
  for (auto to : g[v]) {
    if (to != par && !used_centroid[to]) {
      dfs(to, v, sum ^ a[to], centroid);
    }
  }
}
void upd(int v, int par, int val, int sum) {
  for (int i = 0; i < 20; i++) {
    if (sum & (1 << i))
      c[i][1] += val;
    else
      c[i][0] += val;
  }
  for (auto to : g[v]) {
    if (to != par && !used_centroid[to]) {
      upd(to, v, val, sum ^ a[to]);
    }
  }
}
void add(int v, int par) {
  for (int i = 0; i < 20; i++) {
    if ((1 << i) & c1[v])
      an += 1ll * c[i][0] * (1 << i);
    else
      an += 1ll * c[i][1] * (1 << i);
  }
  for (auto to : g[v]) {
    if (to != par && !used_centroid[to]) {
      add(to, v);
    }
  }
}
void solve(int v) {
  memset(c, 0, sizeof(c));
  dfs(v, -1, a[v], v);
  for (auto to : g[v]) {
    if (!used_centroid[to]) {
      upd(to, -1, -1, a[to]);
      add(to, -1);
    }
  }
}
void calc_sz(int v, int par) {
  sz[v] = 1;
  cnt++;
  for (auto to : g[v]) {
    if (to != par && !used_centroid[to]) {
      calc_sz(to, v);
      sz[v] += sz[to];
    }
  }
}
int getCentroid(int v, int par) {
  int u = -1;
  bool ok = true;
  for (auto to : g[v]) {
    if (!used_centroid[to] && to != par) {
      if (sz[to] > cnt / 2) {
        ok = false;
      }
      if (u == -1 || sz[to] > sz[u]) {
        u = to;
      }
    }
  }
  if (ok) return v;
  return getCentroid(u, v);
}
int getCentroid(int v) {
  cnt = 0;
  calc_sz(v, -1);
  return getCentroid(v, -1);
}
void centroid_decomp(int v) {
  int centroid = getCentroid(v);
  used_centroid[centroid] = true;
  solve(centroid);
  for (auto to : g[centroid]) {
    if (!used_centroid[to]) {
      centroid_decomp(to);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < n - 1; i++) {
    int from, to;
    cin >> from >> to;
    g[from - 1].push_back(to - 1);
    g[to - 1].push_back(from - 1);
  }
  centroid_decomp(0);
  cout << an << endl;
}
