#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,tot,si[N],fa[N],f[N],head[N],nex[N<<1],to[N<<1],a[N];
void add(int u,int v){to[++tot]=v;nex[tot]=head[u];head[u]=tot;}
vector<int>v[N];
ll ans[N],s[N];
int top,st[N];
void dfs1(int u,int p)
{
    si[u]=1;fa[u]=p;
    for(int i=head[u];i;i=nex[i])
    {
        int v=to[i];if(v==p)continue;
        dfs1(v,u);
        si[u]+=si[v];
    }
}
void dfs2(int u,int p)
{
    if(u==1||a[u]==a[p]) f[u]=0;
    else
    {
        f[u]=si[u];
        if(v[a[u]].size())
        {
            f[st[v[a[u]].back()+1]]-=si[u];
        }
    }
    st[++top]=u;
    v[a[u]].push_back(top);
    for(int i=head[u];i;i=nex[i])
    {
        int v=to[i];if(v==p)continue;
        dfs2(v,u);
    }
    top--;
    v[a[u]].pop_back();
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]),s[a[i]]--,s[i]+=n;
    for(int i=1;i<n;i++)
    {
        int u,v;scanf("%d%d",&u,&v);add(u,v);add(v,u);
    }
    dfs1(1,0);
    dfs2(1,0);
    for(int i=2;i<=n;i++)
    {
        if(f[i]==0) continue;
        int c=a[fa[i]];
        s[c]-=f[i];
        ans[c]+=(ll)f[i]*(f[i]-1)/2+f[i];
    }
    for(int i=1;i<=n;i++)
    {
        ans[i]+=(ll)s[i]*(s[i]-1)/2+s[i];
        printf("%lld\n",(ll)n*(n-1)/2+n-ans[i]);
    }
}
