#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
const int INF = 1e9;
int n, a[200001], h[200001], c[200001], sz;
struct Node {
ll sum;
int lc, rc;
} mem[1 << 22];
vector<int> adj[200001];
void upd(int &n, int i, int v, int l, int r) {
if (not n) n = ++sz;
mem[n].sum += v;
if (l == r) return;
int m = (l + r) >> 1;
if (i <= m) upd(mem[n].lc, i, v, l, m);
else upd(mem[n].rc, i, v, m + 1, r);
}
void erase(int &n, int i, int &v, int l, int r) {
// cerr << l << ' ' << r << ' ' << mem[n].sum << ' ' << v << endl;
if (l > i or not v) return;
if (r <= i and mem[n].sum <= v) {
v -= mem[n].sum;
n = 0;
}
if (not n) return;
if (l == r) {
mem[n].sum -= v;
v = 0;
return;
}
int m = (l + r) >> 1;
erase(mem[n].rc, i, v, m + 1, r);
erase(mem[n].lc, i, v, l, m);
mem[n].sum = mem[mem[n].lc].sum + mem[mem[n].rc].sum;
}
int merge(int a, int b) {
if (not a or not b) return max(a, b);
mem[a].sum += mem[b].sum;
mem[a].lc = merge(mem[a].lc, mem[b].lc);
mem[a].rc = merge(mem[a].rc, mem[b].rc);
return a;
}
int dfs(int i) {
int root = 0;
for (int j: adj[i]) root = merge(root, dfs(j));
upd(root, h[i], c[i], 1, INF);
erase(root, h[i] - 1, c[i], 1, INF);
return root;
}
int main() {
cin >> n;
ll sum = 0;
for (int i = 1; i <= n; ++i) {
cin >> a[i] >> h[i] >> c[i];
if (i > 1) adj[a[i]].emplace_back(i);
sum += c[i];
}
cout << sum - mem[dfs(1)].sum;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |