#include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) int n; vector p; vector w; vector > son; vector dp; ll res = 0; ll dodp(int v, int lvl) { bool haf = w[v] & (1 << lvl); dp[v] = haf; res += dp[v]; for (auto s : son[v]) { dodp(s, lvl); res += haf * dp[v] * dp[s]; dp[v] += haf * dp[s]; } return dp[v]; } ll addlvl(int lvl) { dp = {}; dp.resize(n); res = 0; dodp(0, lvl); return res * (1 << lvl); } int main(void) { ios_base::sync_with_stdio(false); cin >> n; p.resize(n, -1); w.resize(n); rep(i, 0, n) cin >> w[i]; son.resize(n); vector> g(n); rep(i, 0, n - 1) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } vector q = {0}; vector vis(n); vis[0] = true; while (q.size()) { int v = q.back(); q.pop_back(); for (auto s: g[v]) { if (!vis[s]) vis[s] = true, q.push_back(s), p[s] = v, son[v].push_back(s); } } ll sum = 0; rep(lvl, 0, 22) sum += addlvl(lvl); cout << sum << "\n"; }