// Original C++ solution (slower):
#include <iostream>

#include <queue>

#include <map>

#include <bitset>

#include <string>

#include <set>

#include <cstdio>

#include <cmath>

#include <algorithm>

#include <cstring>

#include <iomanip>

#include <ctime>

#include <stack>

#include <cstdlib>

#include <numeric>

#include <cassert>

#include <complex>

#include <iterator>

#include <list>

//#include <unordered_map>

using namespace std;

#define maxn 200007

#define maxm 500007

#define maxq 1000007

#define maxl 1234

#define modn 1000000007

#define scan(a) scanf("%d",&a)

#define scanl(a) scanf("%lld",&a)

#define scanl2(a,b) scanf("%lld%lld",&a,&b)

#define scans(a) scanf("%s",a)

#define scans2(a,b) scanf("%s%s",a,b)

#define scand(a) scanf("%lf",&a)

#define scan2(a,b) scanf("%d%d",&a,&b)

#define scand2(a,b) scanf("%lf%lf",&a,&b)

#define scan3(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define scan4(a,b,c,d) scanf("%d%d%d%d",&a,&b,&c,&d)

#define scan5(a,b,c,d,e) scanf("%d%d%d%d%d",&a,&b,&c,&d,&e)

#define print(a) printf("%d\n",a);

#define print2(a,b) printf("%d %d\n",a,b);

#define printl(a) printf("%lld\n",a);

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define rrep(i,a,b) for(int i=a;i>= b;i--)

#define fscan(a) fscanf(stream,"%d", &a);

#define mp      make_pair	

#define pb      push_back

#define eb      emplace_back

#define mm(a,b) memset(a,b,sizeof a)

#define log2(n) (double)(log(n) / log(2.0))

#define _crt_disable_perfcrit_locks

#define bll __int128

#pragma warning(disable:4996)

typedef long long ll;

typedef unsigned long long ull;

const int inf = 0x3f3f3f3f;

typedef vector <int> vi;

typedef vector <ll> vll;

typedef map <ll, ll> mll;

typedef pair <ll, ll> pll;

typedef map <int, int> mii;

typedef pair <int, int> pii;

typedef map <char, int> mci;

typedef map <char, char> mcc;

typedef pair <char, int> pci;

typedef complex<double> cd;

typedef vector<complex<double> > vcd;

const double eps = 1e-8;

const double PI = 2 * acos(0.0);



int cc, bb; char ch; inline int F() {

	while (ch = getchar(), (ch < 48 || ch> 57) && ch != '-'); ch == '-' ? cc = bb = 0 : (cc = ch - '0', bb = 1);

	while (ch = getchar(), ch > 47 && ch < 58)cc = (cc << 1) + (cc << 3) + (ch ^ 48); return bb ? cc : -cc;

}

void write(int x) {

	int y = 10, len = 1;

	while (y <= x) { y *= 10; len++; }

	while (len--) { y /= 10; putchar(x / y + 48); x %= y; }

}

ll gcd(ll a, ll b) {

	ll r;

	if (a < 0)a = -a;

	if (b < 0)b = -b;

	while (b != 0) {

		r = a % b;

		a = b;

		b = r;

	}

	return a;

}

ll mod_mul(ll a, ll b, ll mod) {

	ll res = 0;

	while (b) {

		if (b & 1) if ((res += a) > mod)res -= mod;

		if ((a <<= 1) > mod)a -= mod;

		b >>= 1;

	}

	return res;

}

ll pow2(ll a, ll b, ll mod) {

	ll r = 1, base = a;

	while (b) {

		if (b & 1) r = mod_mul(r, base, mod);

		base = mod_mul(base, base, mod);

		b >>= 1;

	}

	return r;

}

ll inv(ll a, ll n) {

	return pow2(a, n - 2, n);

	//return pow2(a, oula(n) - 1, n);

}

bool MillerRabin(ll n) {

	if (n < 2)return false;

	if (n == 2)return true;

	if (!(n & 1))return false;

	ll u = n - 1;

	while (!(u & 1))u >>= 1;

	ll m = u;

	ll a[13] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 };

	for (int i = 0; i < 12; i++) {

		if (a[i] >= n)

			break;

		ll x = pow2(a[i], u, n);

		ll y;

		while (u < n) {

			y = pow2(x, 2, n);

			if (y == 1 && x != 1 && x != n - 1)

				return false;

			x = y;

			u <<= 1;

		}

		if (x != 1)return false;

		u = m;

	}

	return true;

}

vector<ll> prime;

ll find_factorplus(ll n, ll c) {//pollard-rho函数

	ll i = 1, p = 2;

	ll x0 = rand() % (n - 1) + 1;//随机一个因子来判断

	ll y = x0;

	while (1) {

		i++;

		x0 = (mod_mul(x0, x0, n) + c) % n;

		ll d = gcd(y - x0, n);

		if (d != 1 && d != n) return d;

		if (y == x0) return n;

		if (i == p) {

			y = x0;

			p += p;

		}

	}

}

void find(ll n, ll c) {

	if (n == 1) return;

	if (MillerRabin(n)) {

		prime.push_back(n);

		return;

	}

	ll x = n, p = c;

	while (x == n) {

		x = find_factorplus(x, c--);

	}

	find(n / x, p);

	find(x, p);

}

ll extend_gcd(ll a, ll  b, ll& x, ll& y) {

	if (b == 0) { x = 0; y = 1; return a; };

	if (a % b == 0) {

		x = 0;

		y = 1;

		return b;

	}

	ll res = extend_gcd(b, a % b, y, x);

	y -= a / b * x;

	return res;

}

int n;

vi G[maxn];

int val[maxn];

int res[maxn];

int q[maxn];



void dfs(int v, int fa) {

	int p = lower_bound(q, q + n, val[v]) - q;



	int tmp = q[p];

	q[p] = val[v];

	res[v] = lower_bound(q, q + n, inf) - q;

	for (auto it : G[v])

		if (it != fa)

			dfs(it, v);

	q[p] = tmp;//还原初始状态

}

int main() {

	//ios::sync_with_stdio(0);

	//cin.tie(0);

	//FILE* stream = fopen("L:/20.in", "rb+")

	clock_t start, end;

	start = clock();



	scan(n);

	rep(i, 1, n)

		scan(val[i]);

	int u, v;

	rep(i, 2, n) {

		scan2(u, v);

		G[u].push_back(v);

		G[v].push_back(u);

	}

	mm(q, inf);

	dfs(1, 0);

	rep(i, 1, n)

		printf("%d\n", res[i]);



	end = clock();

	cerr << (end - start) * 1000.0 / CLOCKS_PER_SEC << "ms\n";

	return 0;

}

// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using std::vector;

const int MAXN=200005;

int n,i,cnt,a[MAXN],f[MAXN],ans[MAXN];

vector<int> G[MAXN];

inline void read(int &x)

{

	short negative=1;

    x=0;

    char c=getchar();

    while(c<'0' || c>'9')

    {

    	if(c=='-')

			negative=-1;

		c=getchar();

	}

    while(c>='0' && c<='9')

        x=(x<<3)+(x<<1)+(c^48),c=getchar();

    x*=negative;

}

inline void print(int x)

{

    if (x<0)

        putchar('-'),x=-x;

    if (x>9)

        print(x/10);

    putchar(x%10+'0');

}

inline void dfs(int u,int fa)

{

	int l=1,r=ans[fa],mid,last;

	if (!fa)

		f[1]=a[u],ans[1]=1;

	else

	{

		while (l<=r)

		{

			mid=(l+r)>>1;

			if (a[u]<=f[mid])

				r=mid-1;

			else

				l=mid+1;

		}

		last=f[l];

		f[l]=a[u];

		ans[u]=ans[fa];

		if (l>ans[fa])

			ans[u]++;

	}

	for (int i=0;i<G[u].size();i++)

	{

		int v=G[u][i];

		if (v!=fa)

			dfs(v,u);

	}

	f[l]=last;

}

signed main(void)

{

	read(n);

	for (i=1;i<=n;i++)

		read(a[i]);

	for (i=1;i<n;i++)

	{

		int u,v;

		read(u),read(v);

		G[u].push_back(v);

		G[v].push_back(u);

	}

	dfs(1,0);

	for (i=1;i<=n;i++)

		print(ans[i]),putchar('\n');

	return 0;

} 

// Fastest known solution for this problem: