#include <bits/stdc++.h>
using namespace std;
const int MIF = 1e9 + 7;
const double PI = 4 * atan(1);
inline long long in() {
  long long x = 0;
  int n = 1;
  char c = getchar();
  while (!isdigit(c)) {
    n = (c == '-') ? -1 : 1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * n;
}
inline char inc() {
  char c = getchar();
  while (!isalnum(c)) c = getchar();
  return c;
}
inline string ins() {
  string s = "";
  char c = getchar();
  while (!isalnum(c)) c = getchar();
  while (isalnum(c)) s = s + c, c = getchar();
  return s;
}
inline void out(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) out(x / 10);
  putchar(x % 10 + '0');
}
void fre() {
  ofstream fre("42.inp");
  {
    fre << R"(
5
10 9 8 7 6
1 2
2 3
3 4
3 5
)";
  }
  fre.close();
  freopen(
      "42"
      ".inp",
      "r", stdin);
}
const int N = 100005;
typedef int ar_N[N];
ar_N a, b, cha;
vector<int> g[N];
int f[N][2], n;
long long res, cnt;
void DFS(int first) {
  f[first][0] = f[first][1] = 0;
  for (auto& i : g[first])
    if (i != cha[first]) {
      cha[i] = first;
      DFS(i);
      cnt += f[first][0] * f[i][1];
      cnt += f[first][1] * f[i][0];
      f[first][0] += f[i][b[first]];
      f[first][1] += f[i][(1 + b[first]) % 2];
    }
  f[first][b[first]]++;
  cnt += f[first][1];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  n = in();
  for (int i = 1; i <= n; i++) a[i] = in();
  for (int i_ = 1; i_ <= n - 1; i_++) {
    int first = in(), second = in();
    g[first].emplace_back(second), g[second].emplace_back(first);
  }
  for (int tt = 1; tt <= 20; tt++) {
    cnt = 0;
    bool mot = false;
    for (int i = 1; i <= n; i++)
      b[i] = ((a[i] >> (tt - 1)) & 1LL), mot = (mot || b[i]);
    if (!mot) continue;
    DFS(1);
    res += (1ll << (tt - 1)) * cnt;
  }
  cout << res;
}
