rt
感谢qwq
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define re register
#define Elaina 0
#define lson tr[rt].ls
#define rson tr[rt].rs
inline int read(){
int x=0,f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x*f;
}
int rot[N*2];
int n,m,head[N*2],ct;
int fa[N][21],dep[N];
struct EDGE{
int nxt,to;
}e[N*2];
void add(int x,int y){
e[++ct].to=y;
e[ct].nxt=head[x];
head[x]=ct;
}
class segtr{
public:
int seg=0;
struct NODE{
int ls,rs;
int mx=0;
}tr[N*100];
void pushup(int rt){
tr[rt].mx=max(tr[lson].mx,tr[rson].mx);
}
void insert(int &rt,int l,int r,int pos,int val){
if(!rt) rt=++seg;
if(l==r){
tr[rt].mx+=val;
return;
}
int mid=(l+r)>>1;
if(pos<=mid) insert(lson,l,mid,pos,val);
else insert(rson,mid+1,r,pos,val);
pushup(rt);
}
int query(int rt,int l,int r){
if(!rt) return 0;
if(l==r) return tr[rt].mx?l:0;
int mid=(l+r)>>1;
if(tr[lson].mx>=tr[rson].mx) return query(lson,l,mid);
else return query(rson,mid+1,r);
}
void segmerge(int &rt,int x,int y,int l,int r){
if(!x||!y){
rt=x+y;
return;
}
rt=++seg;
if(l==r){
tr[rt].mx=tr[x].mx+tr[y].mx;
return;
}
int mid=(l+r)>>1;
lson=tr[x].ls;
rson=tr[x].rs;
segmerge(lson,tr[x].ls,tr[y].ls,l,mid);
segmerge(rson,tr[x].rs,tr[y].rs,mid+1,r);
pushup(rt);
return;
}
};
segtr damn;
void dfs1(int x,int f){
dep[x]=dep[f]+1;
fa[x][0]=f;
for(int i=1;i<=20;++i){
fa[x][i]=fa[fa[x][i-1]][i-1];
}
for(int i=head[x];~i;i=e[i].nxt){
if(e[i].to==f){
continue;
}
dfs1(e[i].to,x);
}
}
int lca(int a,int b){
if(dep[a]<dep[b]) swap(a,b);
for(int i=20;i>=0;--i){
if(dep[fa[a][i]]>=dep[b]){
a=fa[a][i];
}
}
if(a==b){
return a;
}
for(int i=20;i>=0;--i){
if(fa[a][i]!=fa[b][i]){
a=fa[a][i],b=fa[b][i];
}
}
return fa[a][0];
}
void dfs2(int x){
for(int i=head[x];~i;i=e[i].nxt){
if(e[i].to==fa[x][0]){
continue;
}
dfs2(e[i].to);
damn.segmerge(rot[x],rot[x],rot[e[i].to],1,100000);
}
}
main(){
mst(head,-1);
n=read(),m=read();
for(int i=1;i<n;++i){
int x=read(),y=read();
add(x,y),add(y,x);
}
dep[0]=0,dep[1]=1;
dfs1(1,0);
while(--m){
int x=read(),y=read(),z=read();
int p=lca(x,y);
damn.insert(rot[x],1,100000,z,1);
damn.insert(rot[y],1,100000,z,1);
damn.insert(rot[p],1,100000,z,-1);
if(fa[p][0]) damn.insert(rot[fa[p][0]],1,100000,z,-1);
}
dfs2(1);
for(int i=1;i<=n;++i) printf("%lld\n",damn.query(rot[i],1,100000));
return Elaina;
}
/*
20 50
8 6
10 6
18 6
20 10
7 20
2 18
19 8
1 6
14 20
16 10
13 19
3 14
17 18
11 19
4 11
15 14
5 18
9 10
12 15
11 14 87
12 1 87
14 3 84
17 2 36
6 5 93
17 6 87
10 14 93
5 16 78
6 15 93
15 5 16
11 8 50
17 19 50
5 4 87
15 20 78
1 17 50
20 13 87
7 15 22
16 11 94
19 8 87
18 3 93
13 13 87
2 1 87
2 6 22
5 20 84
10 12 93
18 12 87
16 10 93
8 17 93
14 7 36
7 4 22
5 9 87
13 10 16
20 11 50
9 16 84
10 17 16
19 6 87
12 2 36
20 9 94
9 2 84
14 1 94
5 5 94
8 17 16
12 8 36
20 17 78
12 18 50
16 8 94
2 19 36
10 18 36
14 19 50
4 12 50
*/