int n, k; vector<int> adj[maxn]; int C[maxn]; ll dp[maxn][maxk];
voiddfs1( int u, int p ){ for( int d = 0; d <= k; ++ d ) { dp[u][d] = C[u]; } for( int v : adj[u] ) { if( v == p ) continue; dfs1( v, u ); for( int d = 1; d <= k; ++ d ) { dp[u][d] += dp[v][d - 1]; } } }
voiddfs2( int u, int p ){ for( int v : adj[u] ) { if( v == p ) continue; for( int d = k; d >= 1; -- d ) { dp[v][d] += dp[u][d - 1]; if( d >= 2 ) dp[v][d] -= dp[v][d - 2]; // 容斥原理 } dfs2( v, u ); } }
voidsolve( ){ n = read( ), k = read( );
for( int i = 1; i < n; ++ i ) { int u = read( ), v = read( ); adj[u].push_back( v ); adj[v].push_back( u ); }
for( int i = 1; i <= n; ++ i ) { C[i] = read( ); }
dfs1( 1, 0 ); dfs2( 1, 0 );
for( int i = 1; i <= n; ++ i ) { cout << dp[i][k] << '\n'; } }