代码如下:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
//by NeighThorn
#define LL long long
using namespace std;
const int maxn=100000+5;
int n,m,hd[maxn],to[maxn],nxt[maxn],cnt,l[maxn],r[maxn];
LL ans=0,sum[maxn],size[maxn],co[maxn],lead[maxn];
inline void add(int x,int y){
to[cnt]=y;
nxt[cnt]=hd[x];
hd[x]=cnt++;
}
inline int merge(int x,int y){
if(!x||!y)
return x+y;
if(co[x]<co[y])
swap(x,y);
r[x]=merge(r[x],y);
sum[x]=sum[l[x]]+sum[r[x]]+co[x];
size[x]=size[l[x]]+size[r[x]]+1;
return x;
}
inline int dfs(int root){
sum[root]=co[root],size[root]=1;
int Root=root;
for(int i=hd[root];i!=-1;i=nxt[i])
Root=merge(Root,dfs(to[i]));
while(sum[Root]>m)
Root=merge(l[Root],r[Root]);
ans=max(ans,lead[root]*size[Root]);
return Root;
}
signed main(void){
cnt=0;
scanf("%d%d",&n,&m);
memset(hd,-1,sizeof(hd));
for(int i=1,x;i<=n;i++)
scanf("%d%lld%lld",&x,&co[i],&lead[i]),add(x,i);
dfs(1);printf("%lld\n",ans);
return 0;
}
by >_< NeighThorn