#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct vertex {
vertex *vl = nullptr, *vr = nullptr;
ll mxv = 0, add = 0;
void extend(vertex *&v) {
if (v == nullptr)
v = new vertex();
}
void update(int tl, int tr, int x, ll val) {
mxv = max(mxv, val);
if (tl + 1 == tr)
return;
int tm = (tl + tr) / 2;
if (x < tm)
extend(vl), vl->update(tl, tm, x, val);
else
extend(vr), vr->update(tm, tr, x, val);
}
ll query(int tl, int tr, int l, int r) {
if (l >= r)
return 0;
if (l == tl && r == tr)
return add + mxv;
int tm = (tl + tr) / 2;
return add + max(
vl ? vl->query(tl, tm, l, min(r, tm)) : 0,
vr ? vr->query(tm, tr, max(l, tm), r) : 0);
}
};
vertex* merge(vertex *v1, vertex *v2, ll mxl1 = 0, ll mxl2 = 0, ll add1 = 0, ll add2 = 0) {
if (v1 == nullptr && v2 == nullptr)
return nullptr;
if (v1 == nullptr) {
add2 += v2->add;
v2->add = max(add1 + add2, mxl1 + add2);
return v2;
}
if (v2 == nullptr) {
add1 += v1->add;
v1->add = max(add1 + add2, mxl2 + add1);
return v1;
}
vertex *v = new vertex();
add1 += v1->add, add2 += v2->add;
v->mxv = max({v1->mxv + add1 + v2->mxv + add2, mxl1 + v2->mxv + add2, mxl2 + v1->mxv + add1});
ll nmxl1 = max(mxl1, add1 + (v1->vl ? v1->vl->mxv : 0));
ll nmxl2 = max(mxl2, add2 + (v2->vl ? v2->vl->mxv : 0));
v->vl = merge(v1->vl, v2->vl, mxl1, mxl2);
v->vr = merge(v1->vr, v2->vr, nmxl1, nmxl2);
return v;
}
typedef pair<int, int> pii;
vector<vector<int>> G;
vector<pii> fruits;
int k;
vertex *dfs(int v) {
vertex *ret = new vertex();
for (int u : G[v])
ret = merge(ret, dfs(u));
auto [d, w] = fruits[v];
if (d) {
ll mxv = ret->query(0, k, 0, d + 1);
ret->update(0, k, d, mxv + w);
}
return ret;
}
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n, m;
cin >> n >> m >> k;
k++;
G.resize(n + 1);
fruits.resize(n + 1);
for (int i = 2; i <= n; i++) {
int p;
cin >> p;
G[p].push_back(i);
}
for (int i = 0; i < m; i++) {
int v, d, w;
cin >> v >> d >> w;
fruits[v] = {d, w};
}
cout << dfs(1)->mxv;
}
# | 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... |
# | 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... |