WA 15pts,AC on #1 #2 #4
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int read()
{
int s=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
s=s*10+c-'0';
c=getchar();
}
return s*f;
}
struct tree_node{
int u,cnt;
friend bool operator<(tree_node a,tree_node b){return (a.cnt==b.cnt)?a.u>b.u:a.cnt<b.cnt;}
friend tree_node operator+(tree_node a,tree_node b){return (tree_node){a.u,a.cnt+b.cnt};}
};
int n,m;
struct linetree{
int s[N<<6][2];
tree_node v[N<<6];
int ct;
void insert(int p,int l,int r,tree_node ve)
{
if(r-l==1){
v[p]=ve+v[p];
return;
}
int mid=(l+r)/2;
if(ve.u<=mid)
insert(s[p][0]=s[p][0]?s[p][0]:++ct,l,mid,ve);
else insert(s[p][1]=s[p][1]?s[p][1]:++ct,mid,r,ve);
v[p]=max(v[s[p][0]],v[s[p][1]]);
}
void merge(int p1,int p2,int l,int r)
{
if(r-l==1){
v[p1]=v[p1]+v[p2];
return;
}
int mid=(l+r)/2;
if(s[p1][0]&&s[p2][0])
merge(s[p1][0],s[p2][0],l,mid);
else if(s[p2][0])s[p1][0]=s[p2][0];
if(s[p1][1]&&s[p2][1])
merge(s[p1][1],s[p2][1],mid,r);
else if(s[p2][1])s[p1][1]=s[p2][1];
v[p1]=max(v[s[p1][0]],v[s[p1][1]]);
}
}tr;
vector<tree_node> ve[N];
struct edge{
int v,next;
}e[N<<1];
int head[N],cnt;
void add(int u,int v)
{
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
int fa[N][22],dep[N];
void dfs1(int u,int lastu)
{
fa[u][0]=lastu;
dep[u]=dep[lastu]+1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==lastu)continue;
dfs1(v,u);
}
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=20;j++)
fa[i][j]=fa[fa[i][j-1]][j-1];
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=0,d=dep[x]-dep[y];d;i++,d>>=1)
if(d&1)x=fa[x][i];
if(x==y)return x;
for(int i=20;i>=0;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
int ans[N];
void dfs2(int u,int father)
{
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==father)continue;
dfs2(v,u);
tr.merge(u,v,0,1e5+5);
}
for(int i=0;i<ve[u].size();i++){
tree_node v=ve[u][i];
tr.insert(u,0,1e5+5,v);
}
ans[u]=tr.v[u].u;
}
signed main()
{
n=read(),m=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v);
add(v,u);
}
dfs1(1,0);
init();
for(int i=1;i<=m;i++){
int x=read(),y=read(),z=read();
int lc=lca(x,y);
ve[x].push_back((tree_node){z,1});
ve[y].push_back((tree_node){z,1});
ve[lc].push_back((tree_node){z,-1});
ve[fa[lc][0]].push_back((tree_node){z,-1});
}
tr.ct=n;
dfs2(1,0);
for(int i=1;i<=n;i++)
cout<<ans[i]<<"\n";
return 0;
}