#include<bits/stdc++.h>

#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define getbit(x,k) ((x)&(1<<k))
#define MASK(x) (((1)<<(x))-1)
#define M 20
const ll inf=1e9;
const int maxn=2e5+5,mod=1e18+9;
using namespace std;

inline ll bp(ll a){return a*a;}
mt19937_64 rang(chrono::steady_clock::now().time_since_epoch().count());


int n,A[maxn];
vector<int>eg[maxn];
int old[maxn],ans[maxn];
int tin[maxn],tout[maxn],counter=0;
struct SegTree
{
    int sz;
    vector<int>st;
    SegTree(){}
    SegTree(int sz): sz(sz),st(sz*4+10,0) {}
    void update(int l, int r, int lab, int a, int val)
    {
        if(l==r)
        {
            st[lab]=val;
            return;
        }
        int mid=(l+r)/2;
        if(a<=mid) update(l,mid,lab*2,a,val);
        else update(mid+1,r,lab*2+1,a,val);
        st[lab]=st[lab*2]+st[lab*2+1];
    }
    int get(int l, int r, int lab, int a, int b)
    {
        if(l>b || r<a) return 0;
        if(l>=a && r<=b) return st[lab];
        int mid=(l+r)/2;
        return get(l,mid,lab*2,a,b)+get(mid+1,r,lab*2+1,a,b);
    }
}f;

void dfs(int u, int p)
{
    tin[u]=++counter;
    for(int v:eg[u])if(v!=p) dfs(v,u);
    tout[u]=counter;
    if(old[A[u]]!=-1) f.update(1,f.sz,1,tin[old[A[u]]],0);
    f.update(1,f.sz,1,tin[u],1);old[A[u]]=u;
    ans[u]=f.get(1,f.sz,1,tin[u],tout[u]);
}
vector<int>N;
void nen()
{
    sort(N.begin(),N.end());
    N.erase(unique(N.begin(),N.end()),N.end());
    for(int i=1;i<=n;i++)
        A[i]=lower_bound(N.begin(),N.end(),A[i])-N.begin()+1;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>A[i];
        N.pb(A[i]);
    }
    nen();
    for(int i=1;i<n;i++)
    {
        int a,b;cin>>a>>b;
        eg[a].pb(b);eg[b].pb(a);
    }
    memset(old,-1,sizeof old);
    f=SegTree(n);
    dfs(1,1);
    for(int i=1;i<=n;i++)
        cout<<ans[i]<<' ';
}
