rt 感谢
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int n,m,t,head[MAXN],tot,f[MAXN][30],cnt,d[MAXN],ans[MAXN],root[MAXN];
struct edge{
int v,nex;
} e[MAXN<<1];
struct sgtree{
int lson,rson,maxx,maxc;
} tr[MAXN<<5];
inline void add_edge(int u,int v){
e[++tot].v=v;
e[tot].nex=head[u];
head[u]=tot;
}
inline void dfs(int x,int fa){
f[x][0]=fa;
d[x]=d[fa]+1;
for(int i=1;i<=t;i++){
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=head[x];i;i=e[i].nex){
int y=e[i].v;
if(y==fa) continue;
dfs(y,x);
}
}
inline int query(int x,int y){
if(d[x]>d[y]) swap(x,y);
for(int i=t;i>=0;i--){
if(d[f[y][i]]>=d[x]) y=f[y][i];
}
if(x==y) return x;
for(int i=t;i>=0;i--){
if(d[f[y][i]]!=d[f[x][i]]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
inline int build(){
cnt++;
return cnt;
}
inline void update(int p){
tr[p].maxx=0;tr[p].maxc=0;
if(tr[p].lson){
if(tr[tr[p].lson].maxx>tr[p].maxx){
tr[p].maxx=tr[tr[p].lson].maxx;
tr[p].maxc=tr[tr[p].lson].maxc;
}
if(tr[tr[p].lson].maxx==tr[p].maxx){
tr[p].maxc=min(tr[p].maxc,tr[tr[p].lson].maxc);
}
}
if(tr[p].rson){
if(tr[tr[p].rson].maxx>tr[p].maxx){
tr[p].maxx=tr[tr[p].rson].maxx;
tr[p].maxc=tr[tr[p].rson].maxc;
}
if(tr[tr[p].rson].maxx==tr[p].maxx){
tr[p].maxc=min(tr[p].maxc,tr[tr[p].rson].maxc);
}
}
}
inline void modify(int p,int l,int r,int val,int typ){
if(l==r){
tr[p].maxx+=typ;
tr[p].maxc=val;
return;
}
int mid=(l+r)>>1;
if(val<=mid){
if(!tr[p].lson) tr[p].lson=build();
modify(tr[p].lson,l,mid,val,typ);
}
else{
if(!tr[p].rson) tr[p].rson=build();
modify(tr[p].rson,mid+1,r,val,typ);
}
update(p);
return;
}
inline int merg(int pl,int pr,int l,int r){
if(!pl||!pr) return pl|pr;
if(l==r){
tr[pl].maxx+=tr[pr].maxx;
return pl;
}
int mid=(l+r)>>1;
tr[pl].lson=merg(tr[pl].lson,tr[pr].lson,l,mid);
tr[pl].rson=merg(tr[pl].rson,tr[pr].rson,mid+1,r);
update(pl);
return pl;
}
inline void solve(int x,int fa){
for(int i=head[x];i;i=e[i].nex){
int y=e[i].v;
if(y==fa) continue;
solve(y,x);
root[x]=merg(root[x],root[y],1,n);
}
ans[x]=tr[root[x]].maxc;
}
int main(){
// freopen("P4556_3.in","r",stdin);
// freopen("P4556_3.txt","w",stdout);
scanf("%d%d",&n,&m);
t=log(n)/log(2)+1;
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y);
add_edge(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++){
root[i]=build();
}
for(int i=1;i<=m;i++){
int x,y,z,lca;
scanf("%d%d%d",&x,&y,&z);
lca=query(x,y);
modify(root[x],1,n,z,1);
modify(root[y],1,n,z,1);
modify(root[lca],1,n,z,-1);
if(lca!=1) modify(root[f[lca][0]],1,n,z,-1);
}
solve(1,0);
for(int i=1;i<=n;i++){
printf("%d\n",ans[i]);
}
return 0;
}