写的比较烂,加了快读在时限内。
#include<bits/stdc++.h>
using namespace std;
int n,m,tot,rt[5200010],f[100010][100],Dep[5200010],ans[5200010];
int u,v,z;
vector<int>e[5200010];
struct edge{
int lef,rig,lefson,rigson;
int Max,Maxid;
}tr[10200010];
inline void dfs(int id,int fa){
Dep[id]=Dep[fa]+1;f[id][0]=fa;
for(int i=1;i<=log(Dep[id]);i++)f[id][i]=f[f[id][i-1]][i-1];
for(auto v : e[id])if(v!=fa)dfs(v,id);
}
inline void update(int id){
if(tr[id].lefson==-1){
tr[id].Max=tr[tr[id].rigson].Max;
tr[id].Maxid=tr[tr[id].rigson].Maxid;
}
else if(tr[id].rigson==-1){
tr[id].Max=tr[tr[id].lefson].Max;
tr[id].Maxid=tr[tr[id].lefson].Maxid;
}
else{
if(tr[tr[id].lefson].Max>=tr[tr[id].rigson].Max){
tr[id].Max=tr[tr[id].lefson].Max;
tr[id].Maxid=tr[tr[id].lefson].Maxid;
}
else{
tr[id].Max=tr[tr[id].rigson].Max;
tr[id].Maxid=tr[tr[id].rigson].Maxid;
}
}
}
inline void modify(int id,int fixid,int fixnum){
if(tr[id].lef==tr[id].rig){tr[id].Max+=fixnum;return;}
int mid=tr[id].lef+tr[id].rig>>1;
if(fixid<=mid){
if(tr[id].lefson==-1){
tr[id].lefson=++tot;
tr[tot].lef=tr[id].lef;
tr[tot].rig=mid;
tr[tot].lefson=tr[tot].rigson=-1;
tr[tot].Max=0;tr[tot].Maxid=tr[id].lef;
}
modify(tr[id].lefson,fixid,fixnum);
update(id);
}
else{
if(tr[id].rigson==-1){
tr[id].rigson=++tot;
tr[tot].rig=tr[id].rig;
tr[tot].lef=mid+1;
tr[tot].lefson=tr[tot].rigson=-1;
tr[tot].Max=0;tr[tot].Maxid=mid+1;
}
modify(tr[id].rigson,fixid,fixnum);
update(id);
}
}
inline void merge(int id,int Lid){
if(tr[id].lef==tr[id].rig){tr[id].Max+=tr[Lid].Max;return;}
if(tr[Lid].lefson!=-1){
if(tr[id].lefson==-1)tr[id].lefson=tr[Lid].lefson;
else merge(tr[id].lefson,tr[Lid].lefson);
}
if(tr[Lid].rigson!=-1){
if(tr[id].rigson==-1)tr[id].rigson=tr[Lid].rigson;
else merge(tr[id].rigson,tr[Lid].rigson);
}
update(id);
}
inline void dfs2(int id,int fa){
for(auto v : e[id])if(v!=fa){dfs2(v,id);merge(rt[id],rt[v]);}
ans[id]=(tr[rt[id]].Max==0?0:tr[rt[id]].Maxid);
}
signed main(){
cin>>n>>m;
for(int i=1,u,v;i<n;i++){
cin>>u>>v;e[u].emplace_back(v);
e[v].emplace_back(u);
}
for(int i=1;i<=n;i++){
rt[i]=++tot;tr[tot].lefson=-1;tr[tot].rigson=-1;
tr[tot].lef=1;tr[tot].rig=100000;tr[tot].Max=0;tr[tot].Maxid=1;
}
dfs(1,0);
while(m--){
cin>>u>>v>>z;
if(Dep[u]<Dep[v])swap(u,v);int Fu=u,Fv=v;
for(int i=log(Dep[u]);i>=0;i--)
if(Dep[f[Fu][i]]>=Dep[v])Fu=f[Fu][i];
for(int i=log(Dep[Fu]);i>=0;i--)
if(f[Fu][i]!=f[Fv][i])Fu=f[Fu][i],Fv=f[Fv][i];
if(Fu!=Fv)Fu=f[Fu][0],Fv=f[Fv][0];
modify(rt[u],z,1);
modify(rt[v],z,1);
modify(rt[Fu],z,-1);
if(f[Fu][0]!=0)modify(rt[f[Fu][0]],z,-1);
}
dfs2(1,0);
for(int i=1;i<=n;i++)cout<<ans[i]<<"\n";
}