我看了讨论区以为是pushup的问题,但是我改了之后一样的输出的3,实在不理解
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int n,m,cnt = 0,rot = 0;
int head[114514],tot,root[114514];
int ans[114514];
struct nd{
int nex,to;
}edge[114514<<1];
struct nn{
int lson,rson,val,mx;
}tr[114514<<6];
int top[114514],siz[114514],son[114514],dep[114514],f[114514];
void add(int x,int y)
{
edge[++tot].nex = head[x];
edge[tot].to = y;
head[x] = tot;
}
//--------以下为树剖-----------
void dfs1(int x,int fa)
{
f[x] = fa; dep[x] = dep[fa]+1;
siz[x] = 1;
for (int i = head[x]; i; i = edge[i].nex)
{
int v = edge[i].to;
if (v == fa) continue;
dfs1(v,x);
siz[x] += siz[v];
if (siz[v] > siz[son[x]])
son[x] = v;
}
}
void dfs2(int x,int tp)
{
top[x] = tp;
if (son[x]) dfs2(son[x],tp);
for (int i = head[x]; i; i = edge[i].nex)
{
int v = edge[i].to;
if (v==f[x] || v==son[x])
continue;
dfs2(v,v);
}
}
int LCA(int x,int y)
{
while (top[x] != top[y]){
if (dep[top[x]] < dep[top[y]])
swap(x,y);
x = f[top[x]];
}
return dep[x]<dep[y]?x:y;
}
//--------以上为树剖------------
//--------以下为线段树 ----------
void pushup(int rt){
if (tr[tr[rt].lson].val >= tr[tr[rt].rson].val){
tr[rt].val = tr[tr[rt].lson].val;
tr[rt].mx = tr[tr[rt].lson].mx;
}else{
tr[rt].val = tr[tr[rt].rson].val;
tr[rt].mx = tr[tr[rt].rson].mx;
}
}
int merge(int x,int y,int l,int r)
{
if (!x) return y;
if (!y) return x;
if (l == r){
tr[x].val += tr[y].val;
return x;
}
int mid = (l+r) >> 1;
tr[x].lson = merge(tr[x].lson,tr[y].lson,l,mid);
tr[x].rson = merge(tr[x].rson,tr[y].rson,mid+1,r);
pushup(x);
return x;
}
int add(int rt,int l,int r,int x,int a)
{
if (!tr[rt].val) rt = ++cnt;
if (l == r)
{
tr[rt].val += a;
tr[rt].mx = x;
return rt;
}
int mid = (l+r) >> 1;
if (x <= mid)
tr[rt].lson = add(tr[rt].lson,l,mid,x,a);
else
tr[rt].rson = add(tr[rt].rson,mid+1,r,x,a);
pushup(rt);
return rt;
}
//--------以上为线段树 ----------
void dfs(int x)
{
for (int i = head[x]; i; i = edge[i].nex)
{
int v = edge[i].to;
if (v == f[x]) continue;
dfs(v);
root[x] = merge(root[x],root[v],1,1e5);
}
if (tr[root[x]].val) ans[x] = tr[root[x]].mx;
}
int main()
{
n = read(); m = read();
for (int i = 1,u,v; i < n; i++)
u = read(),v = read(),add(u,v),add(v,u);
dfs1(1,0); dfs2(1,1);
int x,y,col;
while (m--)
{
x = read(); y = read();
col = read();
int lca = LCA(x,y);
root[x] = add(root[x],1,1e5,col,1);
root[y] = add(root[y],1,1e5,col,1);
root[lca] = add(root[lca],1,1e5,col,-1);
if (f[lca]) root[f[lca]] = add(root[f[lca]],1,1e5,col,-1);
}
dfs(1);
for (int i = 1; i <= n; i++)
printf("%d\n",ans[i]);
return 0;
}