#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#define len(v) (int)((v).size())
template<typename T>
ostream& operator<<(ostream& out, const vector<T> &a){
	for  (auto& x : a){
		out << x << ' ';
	}
	out << '\n';
	return out;
}
template<typename T>
istream& operator>>(istream& in, vector<T> &a){
	for (size_t i = 0; i < a.size(); ++i){
		in >> a[i];
	}
	return in;
}
#define int ll
mt19937 gen;
struct obj{
	ll vl = -1e18, add = 0;
	int i = -1;
	obj() = default;
	obj(int i, int x) : vl(x), i(i) {}
};
obj merge(obj &a, obj &b){
	if (a.vl > b.vl){
		return a;
	}
	else {
		return b;
	}
}
const int sz = 1 << 20;
obj tree[sz];
void push(int v, int ln){
	if (tree[v].add == 0) return;
	if (ln > 1){
		tree[v * 2].add += tree[v].add;
		tree[v * 2 + 1].add += tree[v].add;
	}
	tree[v].vl += tree[v].add;
	tree[v].add = 0;
}
void upd(int v, int l, int r, int ql, int qr, int qx){
	push(v, r - l);
	if (l >= qr || ql >= r) return;
	if (l >= ql && r <= qr) {
		tree[v].add += qx;
		push(v, r - l);
		return;
	}
	int m = (l + r) / 2;
	upd(v * 2, l, m, ql, qr, qx);
	upd(v * 2 + 1, m, r, ql, qr, qx);
	tree[v] = merge(tree[v * 2], tree[v * 2 + 1]);
}
obj sum(int v, int l, int r, int ql, int qr){
	push(v, r - l);
	if (l >= qr || ql >= r) return obj();
	if (l >= ql && r <= qr) return tree[v];
	int m = (l + r) / 2;
	obj r1 = sum(v * 2, l, m, ql, qr);
	obj r2 = sum(v * 2 + 1, m, r, ql, qr);
	return merge(r1, r2);
}
void build(int v, int l, int r, vector<obj>& a){
	if (r - l == 1){
		tree[v] = a[l];
		return;
	}
	int m = (l + r) / 2;
	build(v * 2, l, m, a);
	build(v * 2 + 1, m, r, a);
	tree[v] = merge(tree[v * 2], tree[v * 2 + 1]);
}
const int N = 2e5 + 7;
vector<int> g[N];
int a[N];
bool us[N];
int tim = 0;
int tin[N], tout[N], p[N], h[N];
void dfs2(int v, int pre){
	tin[v] = tim++;
	p[v] = pre;
	h[v] = h[pre] + 1;
	for (int u : g[v]){
		if (u == pre) continue;
		dfs2(u, v);
	}
	tout[v] = tim;
}
const int LGN = 20;
int up[LGN][N];
int la(int v, int k){
	for (int j = LGN - 1; j >= 0; --j){
		if (k >= (1 << j)){
			k -= (1 << j);
			v = up[j][v];
		}
	}
	return v;
}
int lca(int v, int u){
	v = la(v, h[v] - h[u]);
	u = la(u, h[u] - h[v]);
	if (v == u) return v;
	for (int j = LGN - 1; j >= 0; --j){
		if (up[j][v] != up[j][u]){
			v = up[j][v];
			u = up[j][u];
		}
	}
	return up[0][v];
}
int dist(int v, int u){
	return h[v] + h[u] - 2 * h[lca(u, v)];
}
int n;
const int inf = 1e9;
ll dfs(int v){
	obj r = sum(1, 0, n, 0, n);
	int ds = dist(v, r.i);
	v = r.i;
	ll res = 0;
	us[v] = true;
	for (int u : g[v]){
		if (us[u]) continue;
		if (u == p[v]){
			upd(1, 0, n, tin[v], tout[v], -inf);
			res = max(res, dfs(u));
			upd(1, 0, n, tin[v], tout[v], inf);
		}
		else{
			upd(1, 0, n, 0, n, -inf);
			upd(1, 0, n, tin[u], tout[u], inf);
			res = max(res, dfs(u));
			upd(1, 0, n, 0, n, inf);
			upd(1, 0, n, tin[u], tout[u], -inf);
		}
	}
//	us[v] = false;
	return res + ds + 1;
}
inline void solve() {
	cin >> n;
	for (int i = 0; i < n; ++i){
		cin >> a[i];
		us[i] = false;
	}
	for (int i = 0; i < n - 1; ++i){
		int x, y;
		cin >> x >> y;
		g[--x].push_back(--y);
		g[y].push_back(x);
	}
	dfs2(0, 0);
	for (int i = 0; i < n; ++i){
		up[0][i] = p[i];
	}
	for (int j = 1; j < LGN; ++j){
		for (int i = 0; i < n; ++i){
			up[j][i] = up[j - 1][up[j - 1][i]];
		}
	}
	vector<obj> init(n);
	for (int i = 0; i < n; ++i){
		init[tin[i]] = obj(i, a[i]);
	}
	build(1, 0, n, init);
	int ans = 0;
	for (int i = 0; i < n; ++i){
		if (a[i] == n){
			ans = dfs(i);
		}
	}
	cout << ans - 1 << '\n';
}
signed main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cout.precision(60);
	int t = 1;
//	cin >> t;
	while (t--) {
		solve();
	}
}
| # | 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... |