#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:256000000")
using namespace std;
const int INF = (int)1e9 + 7;
const long long LINF = (long long)9e18 + 7;
const double pi = acos(-1.0);
const long long P1 = 353251;
const long long P2 = 239017;
const long long MOD = 1e9 + 7;
const long long MOD1 = 1e9 + 7;
const long long MOD2 = 1e9 + 9;
int n, bit;
vector<int> g[100007];
long long ans, ansnow;
int sz[100007];
int sum[100007];
int ha[100007];
int color[100007];
void dfs(int v, int pred, int ss) {
  sz[v] = 1;
  ha[v] = ss ^ ((color[v] >> bit) & 1);
  sum[v] = ha[v];
  for (int to : g[v])
    if (to != pred) dfs(to, v, ha[v]), sz[v] += sz[to], sum[v] += sum[to];
}
void zfs(int v, int pred) {
  vector<pair<int, int> > t;
  for (int to : g[v]) {
    if (to != pred)
      zfs(to, v), t.push_back(make_pair(sum[to], sz[to] - sum[to]));
  }
  int sum0 = 0, sum1 = 0;
  for (auto c : t) sum0 += c.second, sum1 += c.first;
  long long ansnow1 = 0;
  if ((color[v] >> bit) & 1) {
    for (auto c : t) {
      ansnow1 += (long long)(sum0 - c.second) * c.second;
      ansnow1 += (long long)(sum1 - c.first) * c.first;
    }
  } else {
    for (auto c : t) {
      ansnow1 += (long long)(sum0 - c.second) * c.first;
      ansnow1 += (long long)(sum1 - c.first) * c.second;
    }
  }
  if (((color[v] >> bit) & 1) ^ ha[v])
    ansnow1 += (long long)2 * sum0;
  else
    ansnow1 += (long long)2 * sum1;
  ansnow += ansnow1;
}
const bool is_testing = 0;
int main() {
  srand('D' + 'E' + 'N' + 'I' + 'S' + 'S' + 'O' + 'N');
  if (is_testing) {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
  } else {
  }
  cin >> n;
  for (int i = 0; i < n; i++) cin >> color[i];
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  for (bit = 0; bit <= 20; bit++) {
    ansnow = 0;
    memset(sum, 0, sizeof(sum));
    memset(sz, 0, sizeof(sz));
    dfs(0, -1, 0);
    zfs(0, -1);
    ansnow /= 2;
    for (int i = 0; i < n; i++)
      if ((color[i] >> bit) & 1) ansnow++;
    ans += ansnow * (long long)(1 << bit);
  }
  cout << ans;
}
