快读快输不上了
/*
Name: Class
Copyright: CTSC1997
Author: Isshiki Iroha
Date: 07/10/21 15:09
Description: Dp on Tree
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=805;
int n,m;
int Size[maxn];
int head[maxn],tot;
struct node{
int v,nxt;
}kano[maxn<<2];
inline void add_kano(int u,int v){
++tot;
kano[tot].nxt=head[u];
kano[tot].v=v;
head[u]=tot;
}
int score[maxn];
int f[maxn][maxn];
void dp(int u){
for(int i(head[u]);i;i=kano[i].nxt){
int v=kano[i].v;
dp(v);
Size[u]+=Size[v];
int dp1=min(Size[u],m);
for(int j(dp1);j>=1;--j){
int dp2=min(j-1,Size[v]+100000);
for(int k(0);k<=dp2;++k){
f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]);
}
}
}
}
int main() {
read(n,m);
for(int i(1),s;i<=n;++i){
read(s,score[i]);
f[i][1]=score[i];
add_kano(s,i);
}
memset(Size,1,sizeof Size);
++m;
dp(0);
write(f[0][m]);
return 0;
}