#include #include #define chmin(x,y) (x) = min((x),(y)) #define chmax(x,y) (x) = max((x),(y)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define vec vector #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define pb push_back #define eb emplace_back using namespace std; using namespace atcoder; using ll = long long; using ld = long double; const ll mod = 998244353; using mint = modint998244353; const vector dx = {1,0,-1,0}, dy = {0,1,0,-1}; // using Graph = vector>>; using Graph = vector>; int main(){ // input + prep int N; cin >> N; vec S(N+2,0); // 超頂点:0=start, N+1=end rep(i,N) cin >> S[i+1]; Graph G(N+2); rep(i,N-1){ int a,b; cin >> a >> b; if(S[a] > S[b]) G[b].pb(a); if(S[a] < S[b]) G[a].pb(b); } rep(i,N){ G[0].pb(i+1); G[i+1].pb(N+1); } // solve vec dist(N+2,-1); priority_queue> pq; dist[0] = 0; pq.emplace(0,0); while(!pq.empty()){ auto[score, pos] = pq.top(); pq.pop(); if(dist[pos] > score) continue; for(auto nxt : G[pos]){ ll score_nxt = score + S[nxt]; if(dist[nxt] < score_nxt){ dist[nxt] = score_nxt; pq.emplace(score_nxt, nxt); } } } // output ll ans = dist.back(); cout << ans << endl; }