bool DBG = false;
#include<bits/stdc++.h>
//#include <boost/multiprecision/cpp_dec_float.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using ll = long long;
using ld = long double;
//using i128 = __int128_t;
//using bint = boost::multiprecision::cpp_int
//using d1024 = boost::multiprecision::number<mp::cpp_dec_float<1024>>;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define IFOR(i,a,b) for(int i=(b-1);i>=(a);--i)
#define RPT(i,a,b) for(int i=(a);i<((a)+(b));++i)
#define IRPT(i,a,b) for(int i=((a)+(b)-1);i>=(a);--i)
#define ALL(x) x.begin(),x.end()
#define RALL(x) x.rbegin(),x.rend()
#define fs first
#define sd second
#define couts(x) cout << (x) << (" ")
#define coutn(x) cout << (x) << ("\n")
#define endl "\n"
#define pb push_back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define dcouts(x) if(DBG) couts(x)
#define dcoutn(x) if(DBG) coutn(x)
template<typename T> std::istream &operator>>(std::istream &is, std::vector<T> &vec){ for (auto &v : vec) is >> v; return is; }
template<typename T1, typename T2> std::istream &operator>>(std::istream &is, std::pair<T1,T2> &p){is >> p.first >> p.second; return is; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec){ os << "["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::deque<T> &vec){ os << "deque["; for (auto v : vec) os << v << ","; os << "]"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::unordered_set<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T> std::ostream &operator<<(std::ostream &os, const std::unordered_multiset<T> &vec){ os << "{"; for (auto v : vec) os << v << ","; os << "}"; return os; }
template<typename T1, typename T2> std::ostream &operator<<(std::ostream &os, const std::pair<T1, T2> &pa){ os << "(" << pa.first << "," << pa.second << ")"; return os; }
template<typename TK, typename TV> std::ostream &operator<<(std::ostream &os, const std::map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }
template<typename TK, typename TV> std::ostream &operator<<(std::ostream &os, const std::unordered_map<TK, TV> &mp){ os << "{"; for (auto v : mp) os << v.first << "=>" << v.second << ","; os << "}"; return os; }

template<class T> using V = vector<T>;
template<class T> using V2 = V<V<T>>;
template<class T> using V3 = V<V2<T>>;

using P = pair<ll,int>;


template<class T>
V<T> VF(V<T> v, function<T(T)> f){
  int n = (int) v.size();
  V<T> ret(n);
  for(int i=0; i<n; ++i) {
    T a = v[i];
    ret[i] = f(a);
  }
  return ret;
}
template<class T, class U>
V<U> VF2(V<T> v, function<U(T)> f){
  int n = (int) v.size();
  V<U> ret(n);
  for(int i=0; i<n; ++i) {
    T a = v[i];
    ret[i] = f(a);
  }
  return ret;
}
template<class T>
void VFS(V<T> &v, function<T(T)> f){
  int n = (int) v.size();
  for(int i=0; i<n; ++i) {
    T a = v[i];
    v[i] = f(a);
  }
  return;
}

ll dfs(V2<int> &g, V<int> &c, V<ll> &cnt, V<ll> &cnt2, V<ll> &ans ,int &sz, int s, int par=-1){
  int n = g.size();
  //int bfsz = sz, bfcnt = cnt[c[s]];
  for(auto x: g[s]){
    if(x==par) continue;
    ll bfsz = sz, afsz = 0, bfcnt = cnt[ c[s] ], afcnt = 0;
    dfs(g,c,cnt,cnt2,ans,sz,x,s);
    afsz= sz;
    afcnt = cnt[ c[s] ];
    ll tmp = (afsz - bfsz) - (afcnt - bfcnt);
    ans[ c[s] ] -= tmp*(tmp-1)>>1;
    cnt[ c[s] ] += tmp;
  }
  cnt[ c[s] ]++;
  ++sz;/*
  ll tmp = (sz-bfsz-1) - (cnt[c[s]] - bfcnt);
  ans[c[s]] -= tmp*(tmp-1)/2;
  if(true)cnt[ c[s]  ] += (sz-bfsz) - (cnt[c[s]] - bfcnt);*/
  //couts(s); couts(par); couts(cnt); coutn(ans);
  return 0;
}


void solve(){
  int n; cin >> n;
  V<int> c(n); cin >> c;
  V2<int> cit(n);
  FOR(i,0,n){
    c[i]--;
    cit[c[i]].pb(i);
  }
  V2<int> g(n);
  FOR(i,0,n-1){
    int a, b; cin >> a >> b;
    --a, --b;
    g[a].pb(b);
    g[b].pb(a);
  }
  V<ll> cnt(n,0), cnt2(n,0), ans(n,(ll)n*(n-1)/2); int sz = 0;
  dfs(g,c,cnt,cnt2,ans,sz,0,-1);
  //coutn(ans);
  FOR(i,0,n){
    ans[i] -= (ll)(n-cnt[i])*(n-cnt[i]-1)/2;
    ans[c[i]]++;
  }
  FOR(i,0,n) coutn(ans[i]);
  //coutn(ans);
}




int main(void){
  cin.tie(0);
  ios::sync_with_stdio(false);
  solve();
  return 0;
}

Measured memory_bytes: 53240