#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const int mod = 1e9 + 7;
const int inf = 2e9 + 5;
const ll linf = 9e18 + 5;
int n;
const int N = 1e5 + 5;
vector<int> adj[N];
int label[N];
void init() {}
void input() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> label[i];
  }
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
}
vector<ll> dfs(int u, int p, int d) {
  int n = 0;
  ll sum = 0;
  ll ans = 0;
  vector<int> without;
  vector<int> have;
  for (auto v : adj[u]) {
    if (v != p) {
      vector<ll> now = dfs(v, u, d);
      ans += now[0];
      sum += now[1];
      n += now[2];
      have.push_back(now[1]);
      without.push_back(now[2] - now[1]);
    }
  }
  int ord = (label[u] & (1 << d));
  if (ord) {
    ll add = 0;
    for (auto i : have) {
      add += i * (sum - i);
    }
    for (auto i : without) {
      add += i * (n - sum - i);
    }
    add /= 2;
    ans += add;
    ans += n - sum;
    ans++;
  } else {
    for (int i = 0; i < int(have.size()); i++) {
      ans += have[i] * (n - sum - without[i]);
    }
    ans += sum;
  }
  if (ord) {
    return {ans, n - sum + 1, n + 1};
  } else {
    return {ans, sum, n + 1};
  }
}
void solve() {
  ll ans = 0;
  for (ll i = 0; i < 20; i++) {
    vector<ll> now = dfs(0, -1, i);
    ans += now[0] * (1 << i);
  }
  cout << ans;
}
void output() {}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int number_of_testcases = 1;
  while (number_of_testcases--) {
    init();
    input();
    solve();
    output();
  }
  return 0;
}
