#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#ifdef ENABLE_DEBUG
#define dump(a) cerr<<#a<<"="<<a<<endl
#define dumparr(a,n) cerr<<#a<<"["<<n<<"]="<<a[n]<<endl
#else
#define dump(a) 
#define dumparr(a,n) 
#endif
#define FOR(i, a, b) for(ll i = (ll)a;i < (ll)b;i++)
#define For(i, a) FOR(i, 0, a)
#define REV(i, a, b) for(ll i = (ll)b-1LL;i >= (ll)a;i--)
#define Rev(i, a) REV(i, 0, a)
#define REP(a) For(i, a)
#define SIGN(a) (a==0?0:(a>0?1:-1))

typedef long long int ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef pair<ll, ll> pll;
typedef pair<ll,pll> ppll;
typedef vector<ll> vll;
typedef long double ld;
typedef pair<ld,ld> pdd;

const ll INF=(1LL<<50);
#if __cplusplus<201700L
ll gcd(ll a, ll b) {
  if(a < b) return gcd(b, a);
  ll r;
  while ((r=a%b)) {
    a = b;
    b = r;
  }
  return b;
}
#endif
template<class T>
bool chmax(T& a,const T& b){
  if(a<b){
    a=b;
    return true;
  }
  return false;
}
template<class T>
bool chmin(T& a,const T& b){
  if(a>b){
    a=b;
    return true;
  }
  return false;
}
template<class S,class T>
std::ostream& operator<<(std::ostream& os,pair<S,T> a){
  os << "(" << a.first << "," << a.second << ")";
  return os;
}
template<class T>
std::ostream& operator<<(std::ostream& os,vector<T> a){
  os << "[ ";
  REP(a.size()){
    os<< a[i] << " ";
  }
  os<< " ]";
  return os;
}
void solve(long long N, std::vector<long long> c, std::vector<long long> a, std::vector<long long> b){
  vector<vector<ll>> tree(N),childs(N);
  vector<ll> parent(N,-1);
  REP(N-1){
    tree[a[i]].push_back(b[i]);
    tree[b[i]].push_back(a[i]);
  }
  {
    deque<pll> q;
    q.push_back(pll(0,-1));
    while(!q.empty()){
      auto [c,p] = q.back();q.pop_back();
      parent[c]=p;
      ll cnt=0;
      for (auto &&i : tree[c])
      {
        if(i==p)continue;
        q.push_back(pll(i,c));
        childs[c].push_back(i);
        ++cnt;
      }
    }
  }
  vector<ll> invans(N);
  vector<vector<ll>> tmpcnt(N);
  auto dfs=[&](ll cur,ll parent,auto&& dfs)->ll{
    ll cnt=0;
    vector<ll> cntvec;
    ll col = c[cur];
    for (auto &&i : tree[cur])
    {
      if(i==parent)continue;
      auto prevsize=tmpcnt[col].size();
      cntvec.push_back(dfs(i,cur,dfs));
      cnt+=cntvec.back();
      while(prevsize!=tmpcnt[col].size()){
        cntvec.back()-=tmpcnt[col].back();
        tmpcnt[col].pop_back();
      }
      invans[col]+=cntvec.back()*(cntvec.back()-1)/2+cntvec.back();
    }
    tmpcnt[col].push_back(++cnt);
    return cnt;
  };
  dfs(0,-1,dfs);
  ll allpath=N*(N-1)/2+N;
  REP(N){
    ll n=N;
    For(j,tmpcnt[i].size()){
      n-=tmpcnt[i][j];
    }
    invans[i]+=n*(n-1)/2+n;
  }
  REP(N){
    cout<<allpath-invans[i]<<endl;
  }
}

int main(){
  cout<<setprecision(1000);
    long long N;
    scanf("%lld",&N);
    std::vector<long long> c(N);
    for(int i = 0 ; i < N ; i++){
        scanf("%lld",&c[i]);
        --c[i];
    }
    std::vector<long long> a(N-1);
    std::vector<long long> b(N-1);
    for(int i = 0 ; i < N-1 ; i++){
        scanf("%lld",&a[i]);
        scanf("%lld",&b[i]);
        --a[i];--b[i];
    }
    solve(N, std::move(c), std::move(a), std::move(b));
    return 0;
}


Measured memory_bytes: 72696