WA掉了4个点,都不是特别大的点
调了一晚上了
#include<iostream>
#include<stdio.h>
#define N 200005
#define int long long
using namespace std;
struct edge{
int b,n;
}e[2*N];
struct segment_tree{
int lc,rc,sum,mx;
}d[N*30];
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
int n,m,h[N],tot,x,y,root[N],pool,z,f[N][21],dep[N],ans[N];
void charu(int a,int b){
e[++tot].b=b,e[tot].n=h[a],h[a]=tot;
}
void Deal_first(int u,int fa){
for(int i=1;i<=20;++i) f[u][i]=f[f[u][i-1]][i-1];
for(int i=h[u];i;i=e[i].n){
int v=e[i].b;
if(v==fa) continue;
dep[v]=dep[u]+1;
f[v][0]=u;
Deal_first(v,u);
}
}
int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(int i=20;i>=0;--i){
if(dep[f[x][i]]>=dep[y]) x=f[x][i];
}
if(x==y) return x;
for(int i=20;i>=0;--i){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
void pushup(int k){
if(!d[k].lc || !d[k].rc){
d[k].sum=d[d[k].lc+d[k].rc].sum;
d[k].mx=d[d[k].lc+d[k].rc].mx;
return;
}
if(d[d[k].lc].sum>=d[d[k].rc].sum) d[k].mx=d[d[k].lc].mx;
else d[k].mx=d[d[k].rc].mx;
d[k].sum=max(d[d[k].lc].sum,d[d[k].rc].sum);
}
void update(int &k,int l,int r,int x,int v){
if(l>x || r<x) return;
if(!k) k=++pool;
if(l==r){
d[k].sum+=v;
d[k].mx=l;
return;
}
int mid=l+r>>1;
update(d[k].lc,l,mid,x,v);
update(d[k].rc,mid+1,r,x,v);
pushup(k);
}
int merge(int x,int y,int l,int r){
if(!x || !y) return x+y;
if(l==r){
d[x].sum+=d[y].sum;
d[x].mx=l;
return x;
}
int mid=l+r>>1;
d[x].lc=merge(d[x].lc,d[y].lc,l,mid);
d[x].rc=merge(d[x].rc,d[y].rc,mid+1,r);
pushup(x);
return x;
}
int query()
void dfs(int u,int fa){
for(int i=h[u];i;i=e[i].n){
int v=e[i].b;
if(v==fa) continue;
dfs(v,u);
root[u]=merge(root[u],root[v],1,1e5);
}
if(d[root[u]].sum) ans[u]=d[root[u]].mx;
}
signed main(){
n=read(),m=read();
for(int i=1;i<n;++i){
x=read(),y=read();
charu(x,y);
charu(y,x);
}
Deal_first(1,0);
for(int i=1;i<=m;++i){
x=read(),y=read(),z=read();
update(root[x],1,1e5,z,1);
update(root[y],1,1e5,z,1);
int lca=LCA(x,y);
update(root[lca],1,1e5,z,-1);
if(f[lca][0]) update(root[f[lca][0]],1,1e5,z,-1);
}
dfs(1,0);
for(int i=1;i<=n;++i) printf("%lld\n",ans[i]);
return 0;
}