#include<bits/stdc++.h>
using namespace std;
int n,a,b,cnt=0,jl[1000010]={0},col[1000010]={0},sum[1000010]={0},head[2000010]={0},size[1000010]={0};
int js[1100000]={0},bian[2000010]={0};
struct node{int to,next;}tu[1000010]={0};
queue<int> q[1000010];
void pre_dfs(int x,int fa){
size[x]=1;int pre_jl=sum[col[x]],last=0;sum[col[x]]++;
for(int i=head[x];i;i=tu[i].next){
if(tu[i].to==fa)continue;
pre_dfs(tu[i].to,x);
size[x]+=size[tu[i].to];
if(pre_jl!=sum[col[x]])last=tu[i].to;
bian[i]=size[tu[i].to];
if(i%2)bian[i+1]=n-size[tu[i].to];
else bian[i-1]=n-size[tu[i].to];
}
if(sum[col[x]]==jl[col[x]]&&pre_jl==0)q[col[x]].push(x),js[x]=last;
else if(sum[col[x]]==pre_jl+1)q[col[x]].push(x),js[x]=fa;
}
void solve_1(int x){
queue<int> qq;int sum=0,ans=0,temp;
for(int i=head[x];i;i=tu[i].next)
qq.push(bian[i]),sum+=bian[i];
while(!qq.empty()){
temp=qq.front();qq.pop();
sum-=temp;ans+=sum*temp;
}cout<<(ans+(n-1))<<endl;
}
void solve_2(int x,int y){
int sum_x=1,sum_y=1;
for(int i=head[x];i;i=tu[i].next)
if(tu[i].to!=js[x])sum_x+=bian[i];
for(int i=head[y];i;i=tu[i].next)
if(tu[i].to!=js[y])sum_y+=bian[i];
cout<<sum_x*sum_y<<endl;
}
void add(int u,int v){
cnt++;tu[cnt].to=v;tu[cnt].next=head[u];head[u]=cnt;
cnt++;tu[cnt].to=u;tu[cnt].next=head[v];head[v]=cnt;
}
int main(){
cin>>n;for(int i=1;i<=n;i++)cin>>col[i],jl[col[i]]++;
for(int i=1;i<n;i++)cin>>a>>b,add(a,b);
pre_dfs(1,0);for(int i=1;i<=n;i++){
if(q[i].size()>2)cout<<0<<endl;
if(q[i].size()==1)solve_1(q[i].front());
if(q[i].size()==0)cout<<((n*(n-1))/2)<<endl;
if(q[i].size()==2){int temp=q[i].front();q[i].pop();solve_2(temp,q[i].front());}
}
system("pause");return 0;
}