#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 210000;
const int LOGN = 20;
int n, p[N], dep[N], jmp[N][LOGN];
vector<int> g[N];
void dfs(int v, int p = -1) {
	dep[v] = (p == -1 ? 0 : dep[p] + 1);
	jmp[v][0] = (p == -1 ? v : p);
	for (int k = 1; k < LOGN; k++)
		jmp[v][k] = jmp[jmp[v][k - 1]][k - 1];
	for (int u : g[v]) if (u != p)
		dfs(u, v);
}
int dist(int u, int v) {
	int ans = 0;
	if (dep[u] < dep[v])
		swap(u, v);
	for (int k = LOGN - 1; k >= 0; k--)
		if (dep[u] - (1 << k) >= dep[v]) {
			ans += (1 << k);
			u = jmp[u][k];
		}
	if (u == v) return ans;
	for (int k = LOGN - 1; k >= 0; k--)
		if (jmp[u][k] != jmp[v][k]) {
			ans += (2 << k);
			u = jmp[u][k];
			v = jmp[v][k];
		}
	return ans + 2;
}
bool used[N];
struct dsu {
	vector<int> p, s, t, v;
	dsu(int n) {
		p = s = t = v = vector<int>(n + 1);
		for (int i = 1; i <= n; i++) {
			p[i] = i;
			s[i] = 1;
			t[i] = 0;
			v[i] = i;
		}
	}
	int getp(int x) {return p[x] == x ? x : p[x] = getp(p[x]);}
	void unite(int a, int b) {
		a = getp(a);
		b = getp(b);
		if (a == b) return;
		if (s[a] < s[b]) swap(a, b);
		s[a] += s[b];
		p[b] = a;
		t[a] = max(t[a], t[b]);
	}
};
int32_t main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int x; cin >> x;
		p[x] = i;
	}
	for (int i = 1; i <= n - 1; i++) {
		int a, b; cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	dfs(1);
	dsu cur(n);
	for (int i = 1; i <= n; i++) {
		int opt = 0;
		for (int u : g[p[i]])
			if (used[u])
				opt = max(opt, cur.t[cur.getp(u)] + dist(cur.v[cur.getp(u)], p[i]));
		cur.t[p[i]] = opt;
		for (int u : g[p[i]])
			if (used[u])
				cur.unite(p[i], u);
		cur.v[cur.getp(p[i])] = p[i];
		used[p[i]] = true;
	}
	cout << cur.t[cur.getp(1)];
}
| # | 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... |