RT,疑似在insert函数内数组越界但调不出来
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e6+7;
int n,m,u,v,w,LCA,tot,ans[N],dep[N],fa[N][19],lson[N],rson[N];
int nxt[N],head[N],to[N],cnt;
void add(int u,int v){nxt[++cnt]=head[u],head[u]=cnt,to[cnt]=v;}
struct node{int type,cnt;}tree[N];
node operator+(node A,node B){return {A.type,A.cnt+B.cnt};}
bool operator<(node A,node B){return A.cnt==B.cnt?A.type>B.type:A.cnt<B.cnt;}
vector<node> vec[N];
void insert(int x,int l,int r,node v){
if(l==r){tree[x]=v+tree[x];return;}
int mid=(l+r)/2;
if(v.type<=mid) insert(lson[x]=lson[x]?lson[x]:++tot,l,mid,v);
else insert(rson[x]=rson[x]?rson[x]:++tot,mid+1,r,v);
tree[x]=max(tree[lson[x]],tree[rson[x]]);
}
void merge(int x,int y,int l,int r){
if(l==r){tree[x]=tree[x]+tree[y];return;}
int mid=(l+r)/2;
if(lson[x]&&lson[y]) merge(lson[x],lson[y],l,mid);else if(lson[y]) lson[x]=lson[y];
if(rson[x]&&rson[y]) merge(rson[x],rson[y],mid+1,r);else if(rson[y]) rson[x]=rson[y];
tree[x]=max(tree[lson[x]],tree[rson[x]]);
}
void dfs1(int u){
for(int i=head[u];i;i=nxt[i])
if(to[i]!=fa[u][0]) dep[to[i]]=dep[u]+1,fa[to[i]][0]=u,dfs1(to[i]);
}
int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
for(int i=18;i>=0;i--) if(dep[fa[u][i]]>=dep[v]) u=fa[u][i];
if(u==v) return u;
for(int i=18;i>=0;i--) if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][0];
}
void dfs2(int x){
for(int i=head[x];i;i=nxt[i]){int v=to[i];if(v!=fa[x][0]) dfs2(v),merge(x,v,1,1e5);}
for(node i:vec[x]) insert(x,1,1e5,i);
ans[x]=tree[x].type;
}
int main(){
scanf("%d%d",&n,&m),tot=n;
for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u);
dep[1]=1,dfs1(1);for(int j=1;j<=18;j++) for(int i=1;i<=n;i++) fa[i][j]=fa[fa[i][j-1]][j-1];
for(int i=1;i<=m;i++)
scanf("%d%d%d",&u,&v,&w),LCA=lca(u,v),vec[u].push_back({w,1}),
vec[v].push_back({w,1}),vec[LCA].push_back({w,-1}),vec[fa[LCA][0]].push_back({w,-1});
dfs2(1);for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}