You are given a rooted tree with root in vertex 1. Each vertex is coloured in some colour.

Let's call colour c dominating in the subtree of vertex v if there are no other colours that appear in the subtree of vertex v more times than colour c. So it's possible that two or more colours will be dominating in the subtree of some vertex.

The subtree of vertex v is the vertex v and all other vertices that contains vertex v in each path to the root.

For each vertex v find the sum of all dominating colours in the subtree of vertex v.

Input

The first line contains integer n (1 ≤ n ≤ 105) — the number of vertices in the tree.

The second line contains n integers ci (1 ≤ ci ≤ n), ci — the colour of the i-th vertex.

Each of the next n - 1 lines contains two integers xj, yj (1 ≤ xj, yj ≤ n) — the edge of the tree. The first vertex is the root of the tree.

Output

Print n integers — the sums of dominating colours for each vertex.

Examples

Input

4
1 2 3 4
1 2
2 3
2 4


Output

10 9 3 4


Input

15
1 2 3 1 2 3 3 1 1 3 2 2 1 2 3
1 2
1 3
1 4
1 14
1 15
2 5
2 6
2 7
3 8
3 9
3 10
4 11
4 12
4 13


Output

6 5 4 3 2 3 3 1 1 3 2 2 1 2 3
import java.io.*;
import java.util.*;
public class Main
{
	int n,c[],start[],end[];
	ArrayList<Integer> list[],euler;
	private void solve()throws Exception
	{
		n=nextInt();
		c=new int[n+1];
		for(int i=1;i<=n;i++)
			c[i]=nextInt();
		list=new ArrayList[n+1];
		for(int i=1;i<=n;i++)
			list[i]=new ArrayList<>();
		for(int i=1;i<n;i++)
		{
			int x=nextInt();
			int y=nextInt();
			list[x].add(y);
			list[y].add(x);
		}
		euler=new ArrayList<>();
		euler.add(0);
		start=new int[n+1];
		end=new int[n+1];
		dfs(1,0);
		int n=euler.size()-1;
		int a[]=new int[n+1];
		for(int i=1;i<=n;i++)
			a[i]=c[euler.get(i)];
		Query qu[]=new Query[n+1];
		for(int i=1;i<=n;i++)
			qu[i]=new Query(start[i],end[i],i);
		MoAlgorithm ma=new MoAlgorithm(a,qu);
		long res[]=ma.solve();
		for(int i=1;i<=n;i++)
			out.print(res[i]+" ");
	}
	void dfs(int v,int p)
	{
		euler.add(v);
		start[v]=euler.size()-1;
		for(int vv:list[v])
			if(vv!=p)
				dfs(vv,v);
		end[v]=euler.size()-1;
	}
	class MoAlgorithm
	{
		final int maxn=(int)(1e5);
		int a[],BS,n,m,freq[],maxfreq;
		long res[],sum[];//sum[i] is the sum of all elements having freq i
		Query queries[];
		MoAlgorithm(int arr[],Query qu[])
		{
			a=arr;
			queries=qu;
			n=a.length-1;
			m=queries.length-1;
			BS=(int)Math.ceil(Math.sqrt(n));
			Arrays.sort(queries,1,m+1,(p,q)->{
				int bp=(p.l+BS-1)/BS;
				int bq=(q.l+BS-1)/BS;
				if(bp==bq)
					return p.r-q.r;
				else
					return bp-bq;
			});
		}
		long[] solve()
		{
			res=new long[m+1];
			freq=new int[maxn+1];
			sum=new long[maxn+1];
			maxfreq=0;
			int L=1,R=0;
			for(int i=1;i<=m;i++)
			{
				Query q=queries[i];
				while(R<q.r)
					add(a[++R]);
				while(L>q.l)
					add(a[--L]);
				while(L<q.l)
					remove(a[L++]);
				while(R>q.r)
					remove(a[R--]);
				res[q.idx]=sum[maxfreq];
			}
			return res;
		}
		void add(int val)
		{
			sum[freq[val]]-=val;
			freq[val]++;
			sum[freq[val]]+=val;
			if(freq[val]>maxfreq)
				maxfreq=freq[val];
		}
		void remove(int val)
		{
			sum[freq[val]]-=val;
			freq[val]--;
			sum[freq[val]]+=val;
			if(sum[maxfreq]==0)
				maxfreq--;
		}
	}
	class Query
	{
		int l,r,idx;
		Query(int l,int r,int idx)
		{
			this.l=l;
			this.r=r;
			this.idx=idx;
		}
	}

	 
	///////////////////////////////////////////////////////////

	public void run()throws Exception
	{
		br=new BufferedReader(new InputStreamReader(System.in));
		st=null;
		out=new PrintWriter(System.out);

		solve();
		
		br.close();
		out.close();
	}
	public static void main(String args[])throws Exception{
		new Main().run();
	}
	BufferedReader br;
	StringTokenizer st;
	PrintWriter out;
	String nextToken()throws Exception{
		while(st==null || !st.hasMoreTokens())
		st=new StringTokenizer(br.readLine());
		return st.nextToken();
	}
	String nextLine()throws Exception{
		return br.readLine();
	}
	int nextInt()throws Exception{
		return Integer.parseInt(nextToken());
	}
	long nextLong()throws Exception{
		return Long.parseLong(nextToken());
	}
	double nextDouble()throws Exception{
		return Double.parseDouble(nextToken());
	}
}