#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxN=200005;
int n,cnt;
int c[maxN],b[maxN];
int m[maxN];
vector <int> a[maxN];
int tree[4*maxN+5];
int ans[maxN];
void update(int node,int l,int r,int pos,int val)
{
    if (pos<l||pos>r) return;
    if (l>r) return;
    if (l==r)
    {
        //cout<<pos<<endl;
        tree[node]=val;
        return;
    }
    int mid=(l+r)/2;
    update(node*2,l,mid,pos,val);
    update(node*2+1,mid+1,r,pos,val);
    tree[node]=max(tree[node*2],tree[node*2+1]);
}
int query(int node,int l,int r,int u,int v)
{
    if (u>r||v<l) return 0;
    if (l>r) return 0;
    if (u<=l&&r<=v) return tree[node];
    int mid=(l+r)/2;
    int ml=query(node*2,l,mid,u,v);
    int mr=query(node*2+1,mid+1,r,u,v);
    return max(ml,mr);
}
void dfs(int u,int p)
{
    //cout<<u<<" "<<m[c[u]]<<'\n';
    int x=query(1,1,cnt,1,m[c[u]]-1);
    ans[u]=x+1;
    update(1,1,cnt,m[c[u]],ans[u]);
    for (int v:a[u])
        if (v!=p) dfs(v,u);
    update(1,1,cnt,m[c[u]],0);
}
int32_t main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        int x;
        cin>>c[i];
        b[i]=c[i];
    }
    for (int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    sort(b+1,b+1+n);
    for (int i=1;i<=n;i++)
        if (!m[b[i]]) m[b[i]]=++cnt;
    dfs(1,0);
    for (int i=1;i<=n;i++)
        cout<<ans[i]<<endl;
    return 0;
}
