#include <bits/stdc++.h>
using namespace std;
mt19937 rng(69);
struct node {
	node *l, *r;
	int key, sz;
	long long sum, val, pri;
	node(int x, long long v): pri(rng()), key(x), val(v), sz(1), sum(v), l(NULL), r(NULL) {}
};
long long sum(node *x) {return x?x->sum:0;}
int sz(node *x) {return x?x->sz:0;}
void comp(node *x) {
	x->sum = sum(x->l) + sum(x->r) + x->val;
	x->sz = sz(x->l) + sz(x->r) + 1;
}
void split(int pt, node *x, node *&l, node *&r) {
	if(!x) {
		l=r=NULL;
		return;
	}
	if((x->key) < pt) {
		split(pt,x->r,x->r,r);
		comp(x);
		l=x;
	} else {
		split(pt,x->l,l,x->l);
		comp(x);
		r=x;
	}
}
void merge(node *&x, node *l, node *r) {
	if(!l||!r)
		x = (l?l:r);
	else if(l->pri > r->pri) {
		merge(l->r,l->r,r);
		x = l;
	} else {
		merge(r->l,l,r->l);
		x = r;
	}
	comp(x);
}
int bsta(long long s, node *x) {	
	if(!x)
		return (s<0?-1:1e9);
	if(sum(x->l)>s)
		return bsta(s, x->l);
	if(sum(x->l) + x->val > s)
		return x->key;
	return  bsta(s-sum(x->l)-x->val,x->r);
}
template<typename F>
void proc(node *x, F f) {
	if(!x)
		return;
	proc(x->l,f);
	f(x);
	proc(x->r,f);
}
signed main() {
	int n;
	cin >> n;
	int a[n], h[n], c[n], d[n];
	memset(d,0,sizeof(d));
	for(int i=0;i<n;i++) {
		cin >> a[i] >> h[i] >> c[i];
		d[--a[i]]++;
	}
	node* delta[n];
	for(int i=0;i<n;i++)
		delta[i] = NULL;
	auto dip = [](node *&x, int hv, int cv) {
		node *l, *r;
		split(hv, x, l, r);
		merge(r, new node(hv, cv), r);
		int pt = bsta(sum(l) - cv, l);
		node *ll, *lr;
		split(pt, l, ll, lr);
		if(sum(lr) > cv)
			merge(ll, ll, new node(pt, sum(lr) - cv));
		merge(x, ll, r);
	};
	auto add = [](node *&x, node *&y) {
		if(sz(x) > sz(y))
			swap(x, y);
		auto ins = [&y](node *k) {
			node *l, *r;
			split(k->key, y, l, r);
			merge(y, l, new node(k->key, k->val));
			merge(y, y, r);
		};
		proc(x, ins);
	};
	for(int j=0;j<n;j++)
		for(int i=j;!d[i];i=a[i]) {
			d[i]--;
			d[a[i]]--;
			dip(delta[i], h[i], c[i]);
			add(delta[i], delta[a[i]]);
		}
	long long ans = 0;
	for(int i=0;i<n;i++)
		ans += c[i];
	for(int i=0;i<n;i++)
		if(d[i]>0) {
			vector<int> v = {i};
			int j = i;
			int cnt = 0;
			do {
				if(a[j] != j) {
					add(delta[j], delta[a[j]]);
					delta[j] = NULL;
				}
				d[j] = 0;
				j = a[j];
			} while(j != i);
			vector<pair<int,long long>> op;
			proc(delta[i], [&op](node *k) {op.push_back({k->key,(k->val)});});
			do {
				op.push_back({h[j],c[j]});
				op.push_back({h[j]-1,-c[j]});
				j = a[j];
			} while(j != i);
			sort(op.begin(),op.end(),greater<pair<int,long long>>());
			long long best = sum(delta[i]);
			long long cur = 0;
			for(auto [x, y]: op) {
				cur += y;
				best = max(best, cur);
			}
			ans -= best;
		}
	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... |