1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int n,m;
5 struct node{
6 int lson,rson;
7 }a[305];
8 bool gotson[305];
9 int dp[305][305],s[305];
10 void DP(int rc,int rm)
11 {//if一定要打,要不然会回到虚根导致dp错误
12 if(dp[rc][rm]) return;
13 if(a[rc].rson)
14 DP(a[rc].rson,rm);
15 dp[rc][rm]=dp[a[rc].rson][rm];
16 for(int k=1;k<=rm;k++){
17 if(a[rc].lson)
18 DP(a[rc].lson,k-1);
19 if(a[rc].rson)
20 DP(a[rc].rson,rm-k);
21 dp[rc][rm]=max(dp[rc][rm],dp[a[rc].lson][k-1]+dp[a[rc].rson][rm-k]+s[rc]);
22 }
23
24 }
25 int main(void)
26 {
27 scanf("%d%d",&n,&m);
28 for(int i=1,k;i<=n;++i)
29 {
30 scanf("%d%d",&k,s+i);
31 if(gotson[k])
32 {
33 k=a[k].lson;
34 while(a[k].rson) k=a[k].rson;//找最深的右儿子
35 a[k].rson=i;
36 }
37 else {
38 gotson[k]=1;a[k].lson=i;
39 }//多叉转二叉树
40 }
41 DP(0,m+1);
42 printf("%d",dp[0][m+1]);
43 }