#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N = 1e6 + 5;
const ll inf = LLONG_MAX/5;
ll par[25][N],tmp[N],h[N],p[N],d[N];
vector<ll> a[N];
void build(ll x, ll px)
{
    for(auto y : a[x])
    {
        if(y == px) continue;
        par[0][y] = x;
        h[y] = h[x] + 1;
        build(y,x);
    }
}
ll fp(ll x)
{
    if(p[x] == 0) return x;
    else
    {
        p[x] = fp(p[x]);
        return p[x];
    }
}
ll cntpath(ll x, ll y)
{
    ll i,j;
    if(h[x] < h[y]) swap(x,y);
    ll ans = 0;
    for(i = 20;i >= 0;i--)
    {
        if(h[par[i][x]] >= h[y])
        {
            ans += (1LL << i);
            x = par[i][x];
        }
    }
    if(x == y) return ans;
    for(i = 20;i >= 0;i--)
    {
        if(par[i][x] != par[i][y])
        {
            ans += 2 * (1LL << i);
            x = par[i][x];
            y = par[i][y];
        }
    }
    ans += 2;
    return ans;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll n;
    cin >> n;
    ll i,j;
    for(i = 1;i <= n;i++)
    {
        ll tm;
        cin >> tm;
        tmp[i] = tm;
    }
    for(i = 1;i < n;i++)
    {
        ll u,v;
        cin >> u >> v;
        u = tmp[u];
        v = tmp[v];
        a[u].push_back(v);
        a[v].push_back(u);
    }
    h[1] = 1;
    build(1,0);
    for(i = 1;i <= 20;i++)
    {
        for(j = 1;j <= n;j++) par[i][j] = par[i - 1][par[i - 1][j]];
    }
    for(i = 1;i <= n;i++) p[i] = -1;
    for(i = 1;i <= n;i++)
    {
        ll x = i;
        p[x] = 0;
        for(auto y : a[x])
        {
            if(p[y] >= 0)
            {
                d[x] = max(d[x],d[fp(y)] + cntpath(x,fp(y)));
                p[fp(y)] = x;
            }
        }
    }
    cout << d[n];
}
| # | 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... |