#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
typedef long long ll;
const int N=2e5+10;
vector<int>G[N];
int n,col[N],cnt[N],all;
ll ans[N],sz[N];
ll dfs(int u,int fa)
{
    ll tmp=cnt[col[u]];//保存其他树的cnt
    sz[u]=1;
    for(int v:G[u]){
        if(v==fa) continue;
        ll l=all-cnt[col[u]];//子树前
        sz[u]+=dfs(v,u);
        ll r=all-cnt[col[u]];//遍历子树后
        ll len=r-l;
        ans[col[u]]-=(len*(len-1)/2);
    }
    cnt[col[u]]=tmp+sz[u];//每次col[u]的颜色  重新被当前u全部覆盖
    all++;
    return sz[u];
}
int main()
{
    scanf("%d",&n);
    rep(i,1,n) scanf("%d",&col[i]);
    rep(i,2,n)
    {
        int u,v;scanf("%d%d",&u,&v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
 
 
 
    rep(i,1,n) ans[i]=1ll*n*(n-1)/2;//所有路径
    dfs(1,-1);
    for(int i=1;i<=n;++i){//除了子树，从根节点到最近的颜色 联通块也要去掉
        //printf("i:%d cnt:%d ans:%lld\n",i,cnt[i],ans[i]);
        ll len=n-cnt[i];
        ans[i]-=(len*(len-1)/2);
    }
    for(int i=1;i<=n;++i) ans[col[i]]++;//每个单独的点是一条路径
    for(int i=1;i<=n;++i) printf("%lld\n",ans[i]);
}