```cpp
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
struct Node {
int s[2], c, sz, dis;
long long sum;
Node() {};
Node(int _c) { s[0] = s[1] = 0; dis = sz = 1; sum = c = _c; }
} tr[maxn];
int n, f[maxn], b[maxn], L[maxn];
long long m, ans;
void init() {
for (int i = 1; i <= n; i++) f[i] = i;
}
void push_up(int x) {
int l = tr[x].s[0], r = tr[x].s[1];
tr[x].dis = tr[r].dis + 1;
tr[x].sz = tr[l].sz + tr[r].sz + 1;
tr[x].sum = tr[l].sum + tr[r].sum + tr[x].c;
}
int merge(int x, int y) {
if (!x || !y) return x + y;
if (tr[x].c < tr[y].c) swap(x, y);
int &l = tr[x].s[0], &r = tr[x].s[1];
r = merge(r, y);
if (tr[l].dis < tr[r].dis) swap(l, r);
push_up(x);
return x;
}
void pop(int x) {
int l = tr[f[x]].s[0], r = tr[f[x]].s[1];
f[x] = merge(l, r);
}
int main() {
scanf("%d%lld", &n, &m);
init();
for (int i = 1; i <= n; i++) {
int c;
scanf("%d%d%d", b+i, &c, L+i);
tr[i] = Node(c);
}
for (int i = n; i >= 1; i--) {
while (tr[f[i]].sum > m) pop(i);
long long tmp = (long long) tr[f[i]].sz * L[i];
ans = max(ans, tmp);
if (b[i]) f[b[i]] = merge(f[b[i]], f[i]);
}
printf("%lld\n", ans);
return 0;
}
by AlexSong @ 2023-08-29 18:29:44
@[AlexSong](/user/1004299) thx,已关
by liuxy1234 @ 2023-08-29 18:31:00