RT,我寻思我这用到的空间还没有10M啊
#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,f,a[N],b[N],tot[N],sum[N];
long long ans;
vector<int>ve[N];
struct Tree {
int val,ls,rs,dis,f;
} t[N];
int find(int p){
if(t[p].f!=p)t[p].f=find(t[p].f);
return t[p].f;
}
int merge(int p1,int p2){
if(!p1||!p2)return p1+p2;
if(t[p1].val<t[p2].val||(t[p1].val==t[p2].val&&p1>p2))swap(p1,p2);
t[p1].rs=merge(t[p1].ls,p2);
if(t[t[p1].ls].dis<t[t[p1].rs].dis)swap(t[p1].ls,t[p1].rs);
t[p1].dis=t[t[p1].rs].dis+1;
return t[p1].f=t[t[p1].ls].f=t[t[p1].rs].f=p1;
}
void pop(int p,int pos){
tot[pos]-=t[p].val;
t[p].val=-1;
t[t[p].ls].f=t[p].ls;
t[t[p].rs].f=t[p].rs;
t[p].f=merge(t[p].ls,t[p].rs);
}
void dfs(int now){
tot[now]=a[now];
sum[now]=1;
for(int i=0;i<ve[now].size();i++){
int y=ve[now][i];
dfs(y);
tot[now]+=tot[y];
sum[now]+=sum[y];
t[find(now)].f=t[find(y)].f=merge(find(now),find(y));
while(tot[now]>m)pop(find(now),now),sum[now]--;
}
ans=max(ans,(long long)b[now]*sum[now]);
}
signed main() {
//cout<<sizeof(a)*10/1024/1024;
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>f>>a[i]>>b[i];
ve[f].push_back(i);
t[i].f=i,t[i].val=a[i];
}
dfs(1);
cout<<ans<<endl;
}