#include <bits/stdc++.h>
using namespace std;
const int MAX_N = (int)2e5 + 123;
const int mod = (int)1e9 + 7;
int n;
vector<int> g[MAX_N];
int l[MAX_N], r[MAX_N];
vector<int> st;
int a[MAX_N], dp[MAX_N];
struct tree {
  long long sum;
  pair<int, int> cnt[20];
  int add;
  tree() {
    sum = add = 0;
    for (int i = 0; i < 20; i++) cnt[i] = make_pair(0, 0);
  }
  tree(int x) {
    sum = x;
    add = 0;
    for (int i = 0; i < 20; i++) {
      cnt[i] = make_pair(0, 0);
      if (x & (1 << i))
        cnt[i].first = 1;
      else
        cnt[i].second = 1;
    }
  }
  tree operator+(const tree &b) {
    tree res;
    res.sum = sum + b.sum;
    for (int i = 0; i < 20; i++)
      res.cnt[i] = make_pair(cnt[i].first + b.cnt[i].first,
                             cnt[i].second + b.cnt[i].second);
    return res;
  }
} t[4 * MAX_N];
void dfs(int v, int pr = -1) {
  dp[v] = a[v];
  if (pr > 0) dp[v] ^= dp[pr];
  l[v] = (int)((st).size());
  st.push_back(v);
  for (auto to : g[v])
    if (to != pr) dfs(to, v);
  r[v] = (int)((st).size()) - 1;
}
void build(int v = 1, int tl = 0, int tr = n - 1) {
  if (tl == tr) {
    t[v] = tree(dp[st[tl]]);
    return;
  }
  int tm = (tl + tr) / 2;
  build(v * 2, tl, tm), build(v * 2 + 1, tm + 1, tr);
  t[v] = t[v * 2] + t[v * 2 + 1];
}
void push(int v, int tl, int tr) {
  if (!t[v].add) return;
  for (int i = 0; i < 20; i++)
    if (t[v].add & (1 << i)) {
      t[v].sum = t[v].sum - (1 << i) * 1ll * t[v].cnt[i].first +
                 (1 << i) * 1ll * t[v].cnt[i].second;
      swap(t[v].cnt[i].first, t[v].cnt[i].second);
    }
  if (tl != tr) t[v * 2].add ^= t[v].add, t[v * 2 + 1].add ^= t[v].add;
  t[v].add = 0;
}
void update(int l, int r, int x, int v = 1, int tl = 0, int tr = n - 1) {
  push(v, tl, tr);
  if (l > r || tl > r || l > tr) return;
  if (tl >= l && tr <= r) {
    t[v].add ^= x;
    push(v, tl, tr);
    return;
  }
  int tm = (tl + tr) / 2;
  update(l, r, x, v * 2, tl, tm), update(l, r, x, v * 2 + 1, tm + 1, tr);
  t[v] = (t[v * 2] + t[v * 2 + 1]);
}
long long ans;
void go(int v, int pr = -1) {
  ans += t[1].sum + a[v];
  for (auto to : g[v])
    if (to != pr) {
      update(l[to], r[to], a[v]);
      update(0, l[to] - 1, a[to]);
      update(r[to] + 1, n - 1, a[to]);
      go(to, v);
      update(l[to], r[to], a[v]);
      update(0, l[to] - 1, a[to]);
      update(r[to] + 1, n - 1, a[to]);
    }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d%d", &u, &v);
    g[u].push_back(v), g[v].push_back(u);
  }
  dfs(1);
  build();
  go(1);
  printf("%lld", ans / 2);
  return 0;
}
