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>
using namespace std;
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second
#define endl '\n'
#define puf push_front
#define pof pop_front
#define pub push_back
#define pob pop_back
#define lb lower_bound
#define ub upper_bound
#define rep(x,s,e) for (auto x=s-(s>e);x!=e-(s>e);(s<e?x++:x--))
#define all(x) (x).begin(),(x).end()
#define sz(x) (int) (x).size()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int n;
int arr[200005];
int h[200005];
int c[200005];
vector<int> al[200005];
map<int,ll> s[200005];
void dfs(int i,int p){
	for (auto &it:al[i]){
		if (it==p) continue;
		
		dfs(it,i);
		if (sz(s[i])<sz(s[it])) swap(s[i],s[it]);
		for (auto &it2:s[it]) s[i][it2.fi]+=it2.se;
	}
	
	s[i][0]+=c[i];
	s[i][h[i]+1]+=c[i];
	s[i][h[i]]-=c[i];
	
	auto iter=s[i].find(h[i]);
	
	while ((*iter).se<0){
		ll temp=min((*prev(iter)).se,-(*iter).se);
		(*iter).se+=temp;
		if ((*prev(iter)).se==temp) s[i].erase(prev(iter));
		else (*prev(iter)).se-=temp;
	}
	
	//cout<<i<<": "<<endl;
	//for (auto &it:s[i]) cout<<it.fi<<" "<<it.se<<endl;
	//cout<<endl;
}
bool vis[200005];
bool onstk[200005];
ll ans=0;
void dfs_cyc(int i){
	vis[i]=true;
	onstk[i]=true;
	
	if (!vis[arr[i]]) dfs_cyc(arr[i]);
	else if (onstk[arr[i]]){
		vector<int> v;
		int curr=i;
		do{
			v.pub(curr);
			curr=arr[curr];
		} while (curr!=i);
		
		//for (auto &it:v) cout<<it<<" "; cout<<endl;
		
		map<int,ll> m;
		rep(x,0,sz(v)){
			for (auto &it:al[v[(x+1)%sz(v)]]){
				if (it==v[x]) continue;
				dfs(it,v[(x+1)%sz(v)]);
				for (auto &it2:s[it]) m[it2.fi]+=it2.se;
			}
		}
		
		ll tot=0;
		
		for (auto &it:v) tot+=c[it];
		sort(all(v),[](int i,int j){
			return h[i]>h[j];
		});
		
		ll best=tot+m[0];
		
		while (!v.empty()){
			int hh=h[v.back()];
			
			ll save=0;
			while (!v.empty() && h[v.back()]==hh){
				save+=c[v.back()];
				v.pob();
			}
			
			while (!m.empty() && (*m.begin()).fi<=hh){
				tot+=(*m.begin()).se;
				m.erase(m.begin());
			}
			
			best=min(best,tot-save);
		}
		
		ans+=best;
	}
	
	onstk[i]=false;
}
int main(){
	cin.tie(0);
	cout.tie(0);
	cin.sync_with_stdio(false);
	
	cin>>n;
	rep(x,1,n+1) cin>>arr[x]>>h[x]>>c[x];
	rep(x,1,n+1) al[arr[x]].pub(x);
	
	rep(x,1,n+1) if (!vis[x]) dfs_cyc(x);
	
	cout<<ans<<endl;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |