#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=100000;
vector<pii>adj[maxn+2];
int dp[maxn+2],dp2[maxn+2];
multiset<int>sisa,utama;
int n,k,jaw[maxn+2],ans=0;
void ins(int x){
    if(x==0) return;
    if((int)utama.size()<k) utama.insert(x),ans+=x;
    else {
        if(*utama.begin()<x){
            sisa.insert(*utama.begin());
            ans-=*utama.begin();
            utama.erase(utama.begin());
            utama.insert(x);
            ans+=x;
        } else {
            sisa.insert(x);
        }
    }
}
void del(int x){
    if(x==0) return;
    if((int)utama.size()<k){
        ans-=x;
        utama.erase(utama.find(x));
    } else {
        if(*utama.begin()<=x){
            ans-=x;
            utama.erase(utama.find(x));
            if(sisa.empty()) return;
            ans+=*sisa.rbegin();
            utama.insert(*sisa.rbegin());
            sisa.erase(sisa.find(*sisa.rbegin()));
        } else {
            sisa.erase(sisa.find(x));
        }
    }
}
void dfs(int x,int p){
    dp[x]=0;
    dp2[x]=0;
    for(auto v:adj[x]){
        if(v.fi==p) continue;
        dfs(v.fi,x);
        if(dp[x]<dp[v.fi]+v.se){
            ins(dp[x]);
            dp2[x]=x;
            dp[x]=dp[v.fi]+v.se;
        } else {
            ins(dp[v.fi]+v.se);
            if(dp[v.fi]+v.se>dp2[x]) dp2[x]=dp[v.fi]+v.se;
        }
    }
}
void dfs2(int x,int p){
    jaw[x]=ans;
    for(auto v:adj[x]){
        if(v.fi==p) continue;
        int a=dp[x];
        if(dp[v.fi]+v.se==dp[x]) a=dp2[x];
        int b=dp[v.fi];
        if(a+v.se>dp[v.fi]){
            dp2[v.fi]=dp[v.fi];
            dp[v.fi]=a+v.se;
        } else {
            dp2[v.fi]=max(dp2[v.fi],a+v.se);
        }
        del(b+v.se);
        ins(b);
        del(a);
        ins(a+v.se);
        dfs2(v.fi,x);
        ins(b+v.se);
        del(b);
        ins(a);
        del(a+v.se);
    }
}
signed main() {
	cin>>n>>k;
    for(int i=1;i<=n-1;i++){
        int u,v,w;cin>>u>>v>>w;
        adj[u].push_back({v,w});adj[v].push_back({u,w});
    }
    dfs(1,-1);
    ins(dp[1]);
    jaw[1]=ans;
    dfs2(1,-1);
    for(int i=1;i<=n;i++) cout<<jaw[i]<<endl;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |