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: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
#define all(V) V.begin(),V.end()
#define ll long long
#define MOD 1000000007

vector<ll> G[200010];
stack<ll> col[200010];
ll C[200010];
ll ans[200010];

ll seg[524288];
ll app[200010];

void raq(ll s = 0, ll t = 262143, ll v = 1, ll k = 1, ll l = 0, ll r = 262143) {
	if (t < l || r < s)return;
	if (s <= l && r <= t) {
		seg[k] += v;
		return;
	}
	raq(s, t, v, k * 2, l, (l + r) / 2);
	raq(s, t, v, k * 2 + 1, (l + r) / 2 + 1, r);
}

ll gets(ll x) {
	x += 262144;
	ll ans = 0;
	while (x) {
		ans += seg[x];
		x /= 2;
	}
	return ans;
}

void pini(ll x, ll v) {
	raq(x, x, v - gets(x));
}

ll alc = 0;

void euler(ll c, ll p) {

	for (ll i : G[c]) {
		if (i == p)continue;
		col[C[c]].top() = gets(C[c]);
		col[C[c]].push(0);
		pini(C[c], 0);
		raq();
		raq(C[i], C[i], -1);
		euler(i, c);
	}

	if (p == 0)return;
	ll gc = gets(C[p]);
	if (gc < 0)exit(1);
	ans[C[p]] += gc * (gc - 1LL) / 2LL;
	col[C[p]].pop();
	pini(C[p], col[C[p]].top());
	return;
}

int main() {
	for (ll i = 0;i < 200010;i++)ans[i] = app[i] = C[i] = 0;
	for (ll i = 0;i < 524288;i++)seg[i] = 0;
	ll N, a, b;
	cin >> N;
	for (ll i = 1;i <= N;i++) {
		cin >> C[i];
		app[C[i]]++;
	}
	if (app[C[1]] == N) {
		for (int i = 1;i <= N;i++) {
			if (i == C[1])
				cout << N * (N + 1) / 2 << endl;
			else
				cout << 0 << endl;
		}
		return 0;
	}
	for (ll i = 1;i < N;i++) {
		cin >> a >> b;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	ll st = 0;
	for (ll i = 1;i <= N;i++) {
		if (G[i].size() == 1)st = i;
	}
	for (ll i = 1;i <= N;i++) {
		col[i].push(0);
	}
	raq();
	pini(st, 0);

	euler(st, 0);
	for (ll i = 1;i <= N;i++) {
		if (i == st)continue;
		ll gc = gets(i);
		if (gc < 0)continue;
		ans[i] += gc * (gc - 1) / 2;
	}
	for (ll i = 1;i <= N;i++) {
		if (app[i] == 0)cout << 0 << endl;
		else
			cout << N * (N - 1) / 2 - ans[i] + app[i] << endl;
	}
}