#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const bool Multitest = 0;
const int N = 2e5 + 10;
int a[N], n; vector<int> adj[N];
namespace trau
{
	const int M = 5005;
	vector<pair<int, int>> g[N];
	bool check() 
	{
		return n <= 5000;
	}
	
	int f[M][M]; 
	bool vis[N];
	
	void dfs(int u, int p, int p1)
	{
		f[p1][u] = f[p1][p] + 1;
		for(int v : adj[u]) if(v != p)
		{
			dfs(v, u, p1);			
		}
	}
	
	int dp[N];
	
	void dfs(int u, int p)
	{
		for(auto [v, w] : g[u]) if(v != p)
		{
			dfs(v, u);
			dp[u] = max(dp[v] + w, dp[u]);
		}
	}
	
	int find(int u, int p)
	{
		int ans = u;
		
		for(int v : adj[u]) if(v != p && vis[v] == 0)
		{
			int x = find(v, u);
			
			if(a[ans] < a[x]) ans = x;
		}
		
		return ans;
	}
	
	void comp(int u)
	{
		vis[u] = 1;
		for(int v : adj[u]) if(vis[v] == 0)
		{
			int x = find(v, u);
			
			g[a[u]].push_back({a[x], f[u][x]});
			g[a[x]].push_back({a[u], f[u][x]});
			
			comp(x);
		}
	}
	
	void solve()
	{
		
		for(int i = 1 ; i <= n ; i++)
		{
			f[i][0] = -1;
			dfs(i, 0, i);
		}
	
		for(int i = 1 ; i <= n ; i++) if(a[i] == n) comp(i);
		dfs(n, 0);
		
		cout << dp[n];
	}
}
void work()
{
	cin >> n;
	
	for(int i = 1 ; i <= n ; i++) cin >> a[i];
	
	for(int i = 1 ; i < n ; i++) 
	{
		int u, v;	cin >> u >> v;
		
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	
	if(trau::check()) 
	{
		trau::solve();
		
		return;
	}
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);	cout.tie(0);
	
	int q = 1;
	
	if(Multitest)	cin >> q;
	
	while(q--) work();
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |