#include using namespace std; const int MAX_N = 300000; const int MAX_BITS = 20; int n; vector sons[MAX_N]; int node_lvl[MAX_N]; int tokens[MAX_N]; int open_bits[MAX_N][MAX_BITS]; inline bool is_valid_son(int dad, int son) { return node_lvl[dad] < node_lvl[son]; } inline bool is_set_bit(int num, int b) { return ((num >> b) & 1); } void create_tree(int node, int lvl) { node_lvl[node] = lvl; for (const int son : sons[node]) if (node_lvl[son] == -1) create_tree(son, lvl + 1); } void dp(int node, long long& ans) { // we start ans end in the node ans += tokens[node]; // add node's bits for (int i = 0; i < MAX_BITS; ++i) open_bits[node][i] += is_set_bit(tokens[node], i); // scan sons for (const int son : sons[node]) if (is_valid_son(node, son)) { // let son finish first dp(son, ans); // connect previous sons to this son for (int b = 0; b < MAX_BITS; ++b) if (is_set_bit(tokens[node], b)) ans += (long long)open_bits[node][b] * (long long)open_bits[son][b] * (long long)(1 << b); // update your open bits for (int b = 0; b < MAX_BITS; ++b) if (is_set_bit(tokens[node], b)) open_bits[node][b] += open_bits[son][b]; } } int main() { // get input cin >> n; for (int i = 0; i < n; ++i) cin >> tokens[i]; for (int i = 0; i < n - 1; ++i) { int a, b; cin >> a >> b; sons[a].push_back(b); sons[b].push_back(a); } // precompute input for (int i = 0; i < 300000; ++i) node_lvl[i] = -1; create_tree(0, 0); long long answer = 0; dp(0, answer); cout << answer << endl; }