This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
#pragma GCC optimize("Ofast")
using namespace std; 
using ll = long long;
using str = string;
#define FOR(i, a, b) for ( int i = a ; i <= b ; i++ )
#define FORD(i, a, b) for ( int i = b ; i >= a ; i-- )
#define all(x) x.begin() , x.end()
#define ii pair<ll , int>
#define fi first
#define se second
#define debug(x) cerr << x << " ";
constexpr ll LINF = ( 1e18 + 5 );
constexpr int INF = ( 1e9 + 5 );
constexpr ll MAX = 1e6 + 5;
constexpr int MOD = 1e9;
void setupIO( const string& PROB ){
	cin.tie(nullptr)->sync_with_stdio(false); cout.tie(nullptr);
//	freopen( (PROB + ".inp").c_str(), "r", stdin);
//	freopen( (PROB + ".out").c_str(), "w", stdout);
}
bool vst[MAX];
ll cost[MAX];
struct DSU{
	ll n, ans;
	vector<ll> par, sz, mx;
	DSU( int n ): par(n + 1) , sz(n + 1), mx(n + 1){
		this->n = n; ans = 0;
	}
	void make_set(){
		for ( int i = 1 ; i <= n ; i++ ) par[i] = i, sz[i] = 1, mx[i] = cost[i];
	}
	ll Find( int u ){
		if ( u == par[u] ) return u;
		return par[u] = Find(par[u]);
	}
	bool Union( int a, int b ){
		a = Find(a);
		b = Find(b);
		if ( a == b ) return false;
		if ( sz[a] < sz[b] ) swap( a, b );
		ans += mx[a] + mx[b];
		mx[a] = max( mx[a] , mx[b] );
		sz[a] += sz[b];
		par[b] = a;
		sz[b] = 0;
		return true;
	}
};
struct Node{
	ll u, v, w;
	bool operator < ( const Node& Other ) const{
		return w < Other.w;
	}
};
void Whisper(){
	int n; cin >> n;
	vector<Node> Edge;
	for ( int i = 1 ; i <= n ; i++ ) cin >> cost[i];
	for ( int i = 1 ; i < n ; i++ ){
		Node e;
		cin >> e.v >> e.u;
		e.w = max( cost[e.v], cost[e.u] );
		Edge.push_back(e);
	}
	sort( Edge.begin() , Edge.end() );
	DSU dsu(n);
	dsu.make_set();
	for ( auto&[u, v, w] : Edge ){
		//cout << u << " " << v << " " << w << '\n';
		dsu.Union(u , v);
	}
	cout << dsu.ans;
}	
signed main(){
	setupIO("__Whisper");
    ll Test = 1; //cin >> Test;
    for ( int i = 1 ; i <= Test ; i++ ){
        Whisper();
        //
        cout << '\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... |