Link to this code: https://cses.fi/paste/00b4bd36bb99aa861fd87d/
#include<bits/stdc++.h>
#define REP(i,n) for (int i = 1; i <= n; i++)
#define mod 1000000007
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define lli long long int
#define INF 1000000000
#define endl '\n'
const double PI = 3.141592653589793238460;
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
using namespace std;

int c[200002];
int res[200001];
vi ar[200002];
set<int> *st[200001];

void dfs(int node, int par)
{
	int mx = 0;
	int mxNode = -1;
	
	for(int child : ar[node])
	if(child != par)
	{
		dfs(child , node);
		if( st[child]->size() > mx )
		mx = st[child]->size() , mxNode = child;
	}
	
	if(mxNode == -1) st[node] = new set<int>();
	else			 st[node] = st[mxNode];
	
	st[node] -> insert(c[node]);
	
	for(int child : ar[node])
	if(child != par && child != mxNode)
	{
		for(int color : *st[child])
		st[node]->insert(color);
	}
	
	res[node] = st[node] -> size();
}

int main()
{
	int n , a , b;
	cin>>n;
	REP(i , n) cin>>c[i];
	
	REP(i , n-1) cin>>a>>b , ar[a].pb(b) , ar[b].pb(a);
	
	dfs(1 , -1);
	
	REP(i , n) cout<<res[i]<<" ";
}