AT的cf又炸了
#include<bits/stdc++.h>
#define int long long
#define R(x) x=read()
using namespace std;
inline int read() {
int x=0,y=1;
char e=getchar();
while(e<'0'||e>'9') {
if(e=='-')y=-1;
e=getchar();
}
while(e>='0'&&e<='9') {
x=(x<<1)+(x<<3)+(e^'0');
e=getchar();
}
return x*y;
}
const int N=200005;
int n,k;
vector<int>G[N];
int a[N];
int f[N][10][3],g[10][3];
int ans[N][10];
/*
dp[0/1/2][j][u]: u subtree,use i lines ,and
0: point u is not used
1: point u is used as an endpoint
2: point u is used as a middle point
*/
void dfs(int u,int fa) {
f[u][1][1]=a[u];
f[u][0][0]=0;
for(int v:G[u]) {
if(v==fa)continue;
dfs(v,u);
for(int i=0; i<=k; ++i) g[i][0]=g[i][1]=g[i][2]=-0x3f3f3f3f3f3f;
for(int i=0; i<=k; ++i) {
for(int j=0; i+j-1<=k; ++j) {
if(i+j-1<=k&&i+j-1>=0) g[i+j-1][2]=max(g[i+j-1][2],f[u][i][1]+f[v][j][1]);
if(i+j>k)continue;
g[i+j][0]=max(g[i+j][0],f[u][i][0]+ans[v][j]);
g[i+j][1]=max(max(g[i+j][1],f[u][i][1]+ans[v][j]),f[u][i][0]+f[v][j][1]+a[u]);
g[i+j][2]=max(g[i+j][2],f[u][i][2]+ans[v][j]);
}
}
for(int i=0; i<=k; ++i) {
for(int j=0; j<=2; ++j) {
f[u][i][j]=max(g[i][j],f[u][i][j]);
ans[u][i]=max(f[u][i][j],ans[u][i]);
}
}
}
}
signed main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
memset(f,0xc0,sizeof f);
memset(ans,0xc0,sizeof ans);
R(n),R(k);
for(int i=1; i<=n; ++i) {
R(a[i]);
}
for(int i=1; i<n; ++i) {
int R(x),R(y);
G[x].push_back(y);
G[y].push_back(x);
}
dfs(1,0);
int res=0;
for(int i=0;i<=k;++i){
res=max(res,ans[1][i]);
}cout<<res<<"\n";
// cout<<ans[1][k];
return 0;
}