#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define mod 1000000007
const int N=(1ll<<20);
int n,lv[200001],t[21][200001],arr[200001],ans[200001];
vector <int> v[200001];
void solve(int i,int last){
t[0][i]=last;
lv[i]=lv[last]+1;
for(int j:v[i]){
if(j==last) continue;
solve(j,i);
}
return;
}
int LCA(int a,int b){
if(lv[a]<lv[b]) swap(a,b);
int k=lv[a]-lv[b];
for(int bt=20;bt>=0;bt--){
if(k>=(1<<bt)){
a=t[bt][a];
k-=(1<<bt);
}
}
if(a==b) return a;
for(int bt=20;bt>=0;bt--){
if(t[bt][a]!=t[bt][b]){
a=t[bt][a];
b=t[bt][b];
}
}
return t[0][a];
}
int dis(int a,int b){
return lv[a]+lv[b]-lv[LCA(a,b)]*2;
}
int parent[200001];
int find(int i){
if(parent[i]==i) return i;
return parent[i]=find(parent[i]);
}
void merge(int a,int b){
a=find(a),b=find(b);
parent[b]=a;
return;
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n;
vector <array<int,2>> qu;
for(int i=1;i<=n;i++){
cin>>arr[i];
parent[i]=i;
qu.push_back({arr[i],i});
}
for(int i=0;i<n-1;i++){
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
solve(1,0);
for(int bt=1;bt<=20;bt++){
for(int i=1;i<=n;i++) t[bt][i]=t[bt-1][t[bt-1][i]];
}
sort(qu.begin(),qu.end());
for(auto [val,i]:qu){
for(int j:v[i]){
if(arr[j]>arr[i]) continue;
ans[i]=max(ans[i],ans[find(j)]+dis(find(j),i));
merge(i,j);
}
}
cout<<ans[find(1)]<<endl;
}
//179276892
# | 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... |