Problem:
Score : 600 points

Problem Statement

We have a tree with N vertices numbered 1 to N. The i-th edge in this tree connects Vertex a_i and b_i.
Additionally, each vertex is painted in a color, and the color of Vertex i is c_i. Here, the color of each vertex is represented by an integer between 1 and N (inclusive). The same integer corresponds to the same color; different integers correspond to different colors.

For each k=1, 2, ..., N, solve the following problem:

Find the number of simple paths that visit a vertex painted in the color k one or more times.

Note: The simple paths from Vertex u to v and from v to u are not distinguished.

Constraints

1 \leq N \leq 2 \times 10^5

1 \leq c_i \leq N

1 \leq a_i,b_i \leq N

The given graph is a tree.

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
c_1 c_2 ... c_N
a_1 b_1
:
a_{N-1} b_{N-1}

Output

Print the answers for k = 1, 2, ..., N in order, each in its own line.

Sample Input 1

3
1 2 1
1 2
2 3

Sample Output 1

5
4
0

Let P_{i,j} denote the simple path connecting Vertex i and j.

There are 5 simple paths that visit a vertex painted in the color 1 one or more times:

P_{1,1}\,,\,
P_{1,2}\,,\,
P_{1,3}\,,\,
P_{2,3}\,,\,
P_{3,3}

There are 4 simple paths that visit a vertex painted in the color 2 one or more times:

P_{1,2}\,,\,
P_{1,3}\,,\,
P_{2,2}\,,\,
P_{2,3}

There are no simple paths that visit a vertex painted in the color 3 one or more times.

Sample Input 2

1
1

Sample Output 2

1

Sample Input 3

2
1 2
1 2

Sample Output 3

2
2

Sample Input 4

5
1 2 3 4 5
1 2
2 3
3 4
3 5

Sample Output 4

5
8
10
5
5

Sample Input 5

8
2 7 2 5 4 1 7 5
3 1
1 2
2 7
4 5
5 6
6 8
7 8

Sample Output 5

18
15
0
14
23
0
23
0

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace std;
using namespace __gnu_pbds;   
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update> 
#define ll long long int
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define pll pair<ll,ll>
#define all(x) x.begin(),x.end()
#define sz(x) (ll)x.size() 

vector<ll>ad[200005];
vector<ll>f[200005];
vector<pll>sept[200005];
ll c[200005],pchild[200005],P[200005],sub[200005],par[200005];

ll dfs(ll idx,ll p)
{
	ll g=P[c[idx]];
	par[idx]=p;
	if(P[c[idx]]==-1)
	{
		f[c[idx]].pb(idx);
		P[c[idx]]=idx;
	}
	else
	{
		sept[P[c[idx]]].pb(mp(idx,pchild[c[idx]]));
		P[c[idx]]=idx;
	}
	ll x=1,ind=0;
	for(auto it:ad[idx])
	{
		if(it!=p)
		{
			pchild[c[idx]]=ind;
			x+=dfs(it,idx);
			ind++;
		}
	}

	P[c[idx]]=g;

	return sub[idx]=x;
}
ll O;
ll dfs2(ll idx,ll p)
{
	ll i=0,tot=0;
	while(i<sz(sept[idx]))
	{
		ll j=i,x=sub[ad[idx][sept[idx][i].ss]];
		while(j<sz(sept[idx]) && sept[idx][j].ss==sept[idx][i].ss)
			x-=sub[sept[idx][j].ff],j++;
		tot+=(x*(x+1))/2;
		i=j;
	}

	if(!sz(sept[idx]))
	{
		for(auto it:ad[idx])
		{
			if(it==par[idx])
				continue;
			// if(idx==3)
			// 	cout<<it<<"qw"<<endl;
			tot+=(sub[it]*(sub[it]+1))/2;
		}
	}

	for(auto it:sept[idx])
	{
		if(it.ff!=idx)
			dfs2(it.ff,idx);
	}
	O+=tot;
}

int main()
{
    ios_base::sync_with_stdio(false);
	ll n,i,j,k,x,y,t,m;

	cin >> n;
	for(i=1;i<=n;i++)
		cin >> c[i];
	for(i=1;i<=n-1;i++)
	{
		cin >> x >> y;
		ad[x].pb(y);
		ad[y].pb(x);
	}

	for(i=1;i<=n;i++)
		P[i]=-1;
	dfs(1,1);

	for(i=1;i<=n;i++)
	{
		if(!sz(f[i]))
			cout<<0<<endl;
		else
		{
			O=0,y=sub[1];
			for(auto it:f[i])
				dfs2(it,-1),y-=sub[it];
			
			O+=(y*(y+1))/2;
			cout<<(n*(n+1))/2-O<<endl;
		}
	}
}