#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define sz(x) ((int)x.size())
#define all(x) (x).begin(), (x).end()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define mset(x,y) memset(x,y,sizeof(x))
#define rep(i,n) for(int i=0;i<int(n);i++)
#define per(i,n) for(int i=int(n)-1;i>=0;i--)
#define rng(i,a,b) for(int i=int(a);i<=int(b);i++)
#define gnr(i,b,a) for(int i=int(b);i>=int(a);i--)
using namespace std;
using namespace __gnu_pbds;
using ordered_set = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;
#ifdef LOCAL
#define dmp(...) _dmp(#__VA_ARGS__, __VA_ARGS__)
#else
#define dmp(...) (__VA_ARGS__)
#endif
template<class T> using vt=vector<T>;
template<class T> using vvt=vt<vt<T>>;
template<class TA,class TB> void chmax(TA&a,TB b){if(a<b)a=b;}
template<class TA,class TB> void chmin(TA&a,TB b){if(b<a)a=b;}
template<class TA,class TB>
ostream& operator<<(ostream& os,const pair<TA,TB>& p){
	return os<<"{"<<p.fi<<","<<p.se<<"}";
}
template<class T> ostream& operator<<(ostream& os,const vt<T>& v){
	os<<"{";for(auto& e:v)os<<e<<",";return os<<"}";
}
template<class TH> void _dmp(const char *sdbg, TH h){cout<<sdbg<<"="<<h<<endl;}
template<class TH, class... TA> void _dmp(const char *sdbg, TH h, TA...a){
while(*sdbg!=',')cout<<*sdbg++;cout<<"="<<h<<","; _dmp(sdbg+1, a...);
}
template<class T> void make_unique(vt<T>& v) {
	sort(all(v));v.erase(unique(all(v)),v.end());
}
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
int ri(){int x;cin>>x;return x;}
ll rll(){ll x;cin>>x;return x;}
vi rvi(int n){vi v;rep(i,n)v.pb(ri());return v;}
const int T_MAX = 200010 * 24;
struct PSTFunc {
	int L[T_MAX], R[T_MAX], V[T_MAX];
	int sz = 0;
	int build(int tl, int tr) {
		int nn = ++sz;
		V[nn] = L[nn] = R[nn] = 0;
		if(tl == tr) return nn;
		L[nn] = build(tl, (tl + tr) / 2);
		R[nn] = build((tl + tr) / 2 + 1, tr);
		return nn;
	}
	int update(int n, int tl, int tr, int p, int x) {
		if(p < tl || tr < p) return n;
		int nn = ++sz;
		L[nn] = L[n], R[nn] = R[n], V[nn] = max(V[n], x);
		if(tl == tr) return nn;
		if(p <= (tl + tr) / 2) L[nn] = update(L[n], tl, (tl + tr) / 2, p, x);
		else R[nn] = update(R[n], (tl + tr) / 2 + 1, tr, p, x);
		return nn;
	}
	int query(int n, int tl, int tr, int l, int r) {
		if(tr < l || r < tl || l > r) return 0;
		if(l <= tl && tr <= r) return V[n];
		return max(query(L[n], tl, (tl + tr) / 2, l, r),
			query(R[n], (tl + tr) / 2 + 1, tr, l, r));
	}
} pst;
int n,m,a[200010];
int tr[200010];
int ans[200010];
vi g[200010];
void f(int p,int u) {
	int val=pst.query(tr[p],1,m,1,a[u]-1)+1;
	tr[u]=pst.update(tr[p],1,m,a[u],val);
	ans[u]=max(ans[p],val);
	for(auto& v:g[u])if(v!=p)f(u,v);
}
void MAIN() {
	cin>>n;
	vi va;
	rng(i,1,n)cin>>a[i],va.pb(a[i]);
	make_unique(va);
	rng(i,1,n)a[i]=lower_bound(all(va),a[i])-va.begin()+1;
	m=sz(va);
	rep(i,n-1) {
		int u,v;
		cin>>u>>v;
		g[u].pb(v);
		g[v].pb(u);
	}
	tr[0]=pst.build(1,m);
	f(0,1);
	rng(i,1,n)cout<<ans[i]<<'\n';
}
int main() {
	ios::sync_with_stdio(false);cin.tie(0);
	int T=1;
	//cin>>T;
	for(int tt=1;tt<=T;tt++) {
		MAIN();
	}
	return 0;
}

Measured memory_bytes: 86800