// #include "pch.h"
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <climits>
#include <string>
#include <cmath>
#include <bitset>
#include <complex>
#include <functional>
#include <ctime>
#include <cassert>
#include <fstream>
#include<unordered_map>
#include <stack>
#include <random>

typedef long long ll;
typedef std::pair<int, int> Pii;
typedef std::pair<long long, long long> Pll;
typedef std::pair<double, double> Pdd;

#define rip(i, n, s) for (int i = (s);i < (int)( n ); i++)
#define mapa make_pair
#define all(a) a.begin(), a.end()
#define MM << " " <<

template<typename T>
using MaxHeap = std::priority_queue<T>;
template<typename T>
using MinHeap = std::priority_queue<T, std::vector<T>, std::greater<T>>;

template<typename T>
inline bool chmax(T &a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}
template<typename T>
inline bool chmin(T &a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template<typename T>
void vdeb(std::vector<T> &da) {
    for (int i = 0;i < da.size();i++) {
        if (i == da.size() - 1) std::cout << da[i];
        else std::cout << da[i] << ' ';
    }
    std::cout << std::endl;
}
template<typename T>
void vdeb(std::vector<std::vector<T>> &da) {
    for (int i = 0;i < da.size();i++) vdeb(da[i]);
    std::cout << std::endl;
}

struct SegTree{ //0indexed
    std::vector<int> nod;
    int size;
    SegTree(int x){
        size=1;
        while(x>size){
            size*=2;
        }
        nod=std::vector<int>(size*2-1,0);
    }
    void update(int k,int a){
        k+=size-1;
        nod[k]=a;//最下の処理
        while(k>0){
            k=(k-1)/2;
            nod[k] = std::max(nod[2*k+1], nod[2*k+2]); //下から上へ 
        }
    }
    int query(int a,int b,int k,int l,int r){
        //[a,b)について
        //kは節点の番号,[l,r)はその節点がカバーする範囲
        if(r<=a||b<=l){ //[a,b)と[l,r)が重なって無いとき
            return 0;
        }
        if(a<=l && r<=b){ //[a,b)が[l,r)を完全に含んでいるとき
            return nod[k];
        }
        else{
            return std::max(query(a,b,k*2+1,l,(l+r)/2),query(a,b,k*2+2,(l+r)/2,r));
        }
    }
    void deb(){ //全ノードの出力
		for(int i=0;i<size*2-1;i++){
			if(i==size*2-2){
				std::cout << nod[i] <<std:: endl;
			}
			else{
				std::cout << nod[i] << ' ';
			}
		}
		return;
	}
};
using namespace std;

vector<int> ppp(203000,-1);

void comp(vector<int> &da){
    MinHeap<pair<pair<int,int>,int>> pq;
    rip(i,da.size(),0){
        pq.push({{da[i], -ppp[i]}, i});
    }
    rip(i,da.size(),0){
        auto now = pq.top();
        // cout << now.first.second << endl;
        pq.pop();
        da[now.second] = i;
    }
}

void dfs1(vector<vector<int>> &da, int now){
    rip(i,da[now].size(),0){
        if(ppp[da[now][i]] == -1){
            ppp[da[now][i]] = ppp[now]+1;
            dfs1(da, da[now][i]);
        }
    }
}

void dfs2(vector<vector<int>> &da, vector<int> &a, vector<int> &ans, SegTree &st, int now){
    ans[now] = st.query(0, a[now], 0, 0, st.size) + 1;
    // cout << ans[now] << endl;
    st.update(a[now], ans[now]);
    rip(i,da[now].size(),0){
        if(ans[da[now][i]] == -1){
            dfs2(da, a, ans, st, da[now][i]);
        }
    }
    st.update(a[now], 0);
    chmax(ans[now], st.nod[0]);
}

int main(){
    int n; cin >> n;
    vector<int> a(n);
    rip(i,n,0) cin >> a[i];
    vector<vector<int>> da(n, vector<int>(0));
    rip(i,n-1,0){
        int x,y; cin >> x >> y;
        --x;--y;
        da[x].push_back(y);
        da[y].push_back(x);
    }
    SegTree st(n);
    ppp[0] = 1;
    dfs1(da, 0);
    comp(a);
    // vdeb(ppp);
    vector<int> ans(n, -1);
    dfs2(da, a, ans, st, 0);
    // vdeb(a);
    rip(i,n,0){
        printf("%d\n", ans[i]);
    }
}

Measured memory_bytes: 35664