#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld double
#define FOR(i,l,r) for(int i = (l), _r = (r); i <= _r; i++)
#define FORNG(i,r,l) for(int i = (r), _l = (l); i >= _l; i--)
#define REP(i,r) for(int i = 0, _r = (r); i < _r; i++)
#define endl '\n'
#define fi first
#define se second
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define size(v) ((ll)(v).size())
#define MASK(x) (1LL << (x))
#define BIT(x, i) (((x) >> (i)) & 1)
const ll MOD = 1e9 + 7, N = 2e5 + 10, INF = 1e9, LOG = 18;
int n,a[N],par[N],ma[N],high[N];
ll s[N];
int tpos,pos[N],MIHIGH[LOG + 1][N];
pair<int,int> edge[N];
vector<int> adj[N];
void dfs(int u,int p = -1){
    pos[u] = ++tpos;
    MIHIGH[0][tpos] = u;
    for(int v : adj[u]){
        if(v == p)continue;
        high[v] = high[u] + 1;
        dfs(v, u);
        MIHIGH[0][++tpos] = u;
    }
}
#define MIN(u, v) (high[u] < high[v] ? u : v)
int LCA(int u,int v){
    if(pos[u] > pos[v])swap(u, v);
    int tmp = __lg(pos[v] - pos[u] + 1);
    return MIN(MIHIGH[tmp][pos[u]], MIHIGH[tmp][pos[v] - MASK(tmp) + 1]);
}
int Dist(int u,int v){return high[u] + high[v] - high[LCA(u, v)] * 2;}
int find(int u){return u == par[u] ? u : par[u] = find(par[u]);}
void merge(int u,int v){
    v = find(v);
    par[v] = u;
    s[u] = max(s[u], s[v] + Dist(u, ma[v]));
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    FOR(i,1,n)par[i] = i, ma[i] = i;
    FOR(i,1,n)cin>>a[i];
    FOR(i,1,n - 1){
        int u,v;cin>>u>>v;
        adj[u].pb(v);
        adj[v].pb(u);
        if(a[u] < a[v])swap(u, v);
        edge[i] = {u, v};
    }
    dfs(1);
    FOR(j,1,LOG)FOR(i,1,tpos - MASK(j) + 1)MIHIGH[j][i] = MIN(MIHIGH[j - 1][i], MIHIGH[j - 1][i + MASK(j - 1)]);
    sort(edge + 1, edge + n, [&](const pair<int,int> &lhs,const pair<int,int> &rhs)->bool{
        return a[lhs.fi] < a[rhs.fi];
    });
    FOR(i,1,n - 1){
        int u = edge[i].fi, v = edge[i].se;
        merge(u, v);
    }
    ll ans = 0;
    FOR(i,1,n)ans = max(ans, s[i]);
    cout<<ans;
}
| # | 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... |