#include using namespace std; using ll=long long; using ld=double; using pll=pair; using vll=vector; using vpll=vector; using vvll=vector; #define FOR(i,a,b) for(ll i=a;i<(ll)b;++i) #define ROF(i,a,b) for(ll i=a;i>=(ll)b;--i) #define F(n) FOR(i,0,n) #define FF(n) FOR(j,0,n) #define x first #define y second #define pb push_back vll v; ll n; bool is(ll u, ll i) { return (v[u]&(1ll<0; } unordered_set vis; ll dfsr(vector &ng, ll u, ll j) { ll ret=1; vis.insert(u); for(auto &k: ng[u]) if(is(k,j) && !vis.count(k)) { ret += dfsr(ng,k,j); } return ret; } ll dfs(vector &ng, ll j) { ll ret = 0; F(n) if(is(i,j) && !vis.count(i)) { ll help=dfsr(ng,i,j); if(help==1) ret+=help; else ret+=help+(help)*(help-1)/2; } return ret; } int main(){ ios::sync_with_stdio(0); cin >> n; v=vll(n); F(n) cin>>v[i]; vpll edgs; F(n-1) { ll a,b; cin >> a >> b; edgs.pb({a,b}); } ll ret=0; F(20) { vector ng(n); for(auto &e:edgs) { if(is(e.x,i) && is(e.y,i)) { ng[e.x].pb(e.y); ng[e.y].pb(e.x); } } vis.clear(); ll cnt = dfs(ng,i); ret += (1ll<