#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
int M = 200'010;
int maxlog = 17;
vector<vector<int>> g(M);
vector<int> p(M), h(M), is_off(M), depth(M);
vector<vector<int>> jump(M, vector<int>(maxlog+1));
int find_max(int v, int p) {
	int ans = v;
	for(auto u : g[v]) {
		if(u==p || is_off[u]) continue;
		int fm = find_max(u, v);
		if(h[fm] > h[ans]) ans = fm;
	}
	return ans;
}
void jump_dfs(int v, int p) {
	depth[v] = depth[p] + 1;
	jump[v][0] = p;
	for(int i=1; i<=maxlog; ++i) jump[v][i] = jump[jump[v][i-1]][i-1];
	for(auto u : g[v]) if(u!=p) jump_dfs(u, v);
}
int lca(int a, int b) {
	if(depth[b] > depth[a]) swap(a, b);
	for(int i=maxlog; i>=0; --i) {
		if(depth[jump[a][i]] >= depth[b]) a = jump[a][i];
	}
	if(a==b) return a;
	for(int i=maxlog; i>=0; --i) {
		if(jump[a][i]!=jump[b][i]) {
			a = jump[a][i];
			b = jump[b][i];
		}
	}
	return jump[a][0];
}
int dist(int a, int b) {
	return depth[a] + depth[b] - 2*depth[lca(a, b)];
}
int ans(int v) {
	int odp = 0;
	is_off[v] = 1;
	for(auto u : g[v]) {
		if(is_off[u]) continue;
		int fm = find_max(u, v);
		odp = max(odp, dist(v, fm)+ans(fm));
	}
	return odp;
}
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n;
	cin >> n;
	for(int i=1; i<=n; ++i) {
		cin >> h[i];
		p[h[i]] = i;
	}
	for(int i=1; i<n; ++i) {
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	jump_dfs(1, 0);
	cout << ans(p[n]) << "\n";
	return 0;
}
| # | 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... |