#include <bits/stdc++.h>
const long double EPS = 1e-10;
const int MOD = 1000000007ll;
const int mod1 = 1000000009ll;
const int mod2 = 1100000009ll;
int INF = (int)1e9;
long long int INFINF = (long long int)1e18;
int debug = 0;
long double PI = acos(-1.0);
using namespace std;
int bit_count(long long int _x) {
  long long int _ret = 0;
  while (_x) {
    if (_x % 2 == 1) _ret++;
    _x /= 2;
  }
  return _ret;
}
int bit(long long int _mask, int _i) {
  return (_mask & (1ll << _i)) == 0 ? 0 : 1;
}
int add(int a, int b, int m = MOD) {
  int x = a + b;
  while (x >= m) x -= m;
  while (x < 0) x += m;
  return x;
}
int sub(int a, int b, int m = MOD) {
  int x = a - b;
  while (x < 0) x += m;
  while (x >= m) x -= m;
  return x;
}
int mul(int a, int b, int m = MOD) {
  long long int x = a * 1ll * b;
  x %= m;
  while (x < 0) x += m;
  return (int)x;
}
int ldtoint(long double x) { return (int)(x + 0.5); }
long long int ldtolli(long double x) { return (long long int)(x + 0.5); }
int powermod(long long int _a, long long int _b, int _m = MOD) {
  long long int _r = 1;
  while (_b) {
    if (_b % 2 == 1) _r = mul(_r, _a, _m);
    _b >>= 1;
    _a = mul(_a, _a, _m);
  }
  return _r;
}
template <class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
  os << "[" << p.first << "," << p.second << "]";
  return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "[";
  bool first = true;
  for (T it : v) {
    if (!first) os << ", ";
    first = false;
    os << it;
  }
  os << "]";
  return os;
}
template <class T>
ostream& operator<<(ostream& os, set<T>& v) {
  os << "[";
  bool first = true;
  for (T it : v) {
    if (!first) os << ", ";
    first = false;
    os << it;
  }
  os << "]";
  return os;
}
template <class T1, class T2>
ostream& operator<<(ostream& os, map<T1, T2>& v) {
  os << "[";
  bool first = true;
  for (pair<T1, T2> it : v) {
    if (!first) os << ", ";
    first = false;
    os << "(" << it.first << "," << it.second << ")";
  }
  os << "]";
  return os;
}
template <class T>
void parr(T a[], int s, int e) {
  cout << "[";
  for (int i = s; i < e; i++) cout << a[i] << ", ";
  cout << a[e] << "]\n";
}
int N;
vector<int> G[100010];
long long int A[100010];
long long int cnt0[100010];
long long int cnt1[100010];
long long int ans = 0;
long long int cur;
void dfs(int u, int p) {
  if (A[u])
    cnt1[u]++;
  else
    cnt0[u]++;
  long long int p0, p1;
  p0 = p1 = 0;
  for (int v : G[u]) {
    if (v == p) continue;
    dfs(v, u);
    if (A[u]) {
      cnt0[u] += cnt1[v];
      cnt1[u] += cnt0[v];
      ans += (1LL << cur) * (long long int)cnt0[v] * (long long int)p0;
      ans += (1LL << cur) * (long long int)cnt1[v] * (long long int)p1;
    } else {
      cnt0[u] += cnt0[v];
      cnt1[u] += cnt1[v];
      ans += (1LL << cur) * (long long int)cnt1[v] * (long long int)p0;
      ans += (1LL << cur) * (long long int)cnt0[v] * (long long int)p1;
    }
    p0 += cnt0[v];
    p1 += cnt1[v];
  }
  ans += (1LL << cur) * (long long int)cnt1[u];
}
long long int val[100010];
int main() {
  if (0) {
    freopen("input.txt", "r", stdin);
    debug = 1;
  }
  srand(time(NULL));
  scanf("%d", &N);
  for (int i = 1; i <= N; i++) scanf("%d", &val[i]);
  for (int i = 1; i < N; i++) {
    int u, v;
    scanf("%d", &u);
    scanf("%d", &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int b = 0; b < 20; b++) {
    for (int i = 1; i <= N; i++) A[i] = bit(val[i], b), cnt0[i] = cnt1[i] = 0;
    cur = b;
    dfs(1, 0);
  }
  cout << ans;
  return 0;
}
