rt。谢谢。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
struct ccf
{
int mi,la;
}t[N<<2];
int n,m,l;
int de[N],dfn[N],son[N],s[N],tp[N],a[N],b[N],f[N];
vector<int>v[N];
void dfs1(int x,int fa)
{
f[x]=fa;
s[x]=1;
de[x]=de[fa]+1;
int ma=0;
for(int i=0;i<v[x].size();i++)
{
int to=v[x][i];
if(to==fa)continue;
dfs1(to,x);
s[x]+=s[to];
if(s[to]>ma)
ma=s[to],son[x]=to;
}
}
void dfs2(int x,int top)
{
tp[x]=top;
dfn[x]=++l;
if(!son[x])return ;
dfs2(son[x],top);
for(int i=0;i<v[x].size();i++)
{
int to=v[x][i];
if(to==f[x]||to==son[x])continue;
dfs2(to,to);
}
}
void push_down(int k)
{
int l=k*2,r=k*2+1;
t[l].la=min(t[l].la,t[k].la);
t[r].la=min(t[r].la,t[k].la);
t[l].mi=min(t[l].mi,t[k].la);
t[r].mi=min(t[r].mi,t[k].la);
t[k].la=1e18;
}
void change(int k,int l,int r,int x,int y,int z)
{
if(l>y||r<x)return ;
if(x<=l&&r<=y)
{
t[k].mi=min(t[k].mi,z);
t[k].la=min(t[l].la,z);
return ;
}
push_down(k);
int mid=(l+r)/2;
change(k*2,l,mid,x,y,z);
change(k*2+1,mid+1,r,x,y,z);
}
int ask(int k,int l,int r,int x)
{
if(l>x||r<x)return 1e18;
if(l==r&l==x)return t[k].mi;
push_down(k);
int mid=(l+r)/2;
return min(ask(k*2,l,mid,x),ask(k*2+1,mid+1,r,x));
}
void add(int x,int y,int z)
{
while(tp[x]!=tp[y])
{
if(de[tp[x]]<de[tp[y]])
swap(x,y);
change(1,1,n,dfn[tp[x]],dfn[x],z);
x=f[tp[x]];
}
if(de[x]>de[y])
swap(x,y);
if(x==y)return ;
change(1,1,n,dfn[x]+1,dfn[y],z);
}
signed main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
cin>>a[i]>>b[i];
v[a[i]].push_back(b[i]);
v[b[i]].push_back(a[i]);
}
dfs1(1,1);
dfs2(1,1);
for(int i=1;i<=4*n;i++)
t[i].mi=t[i].la=1e18;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
}
for(int i=1;i<n;i++)
{
if(de[a[i]]<de[b[i]])
swap(a[i],b[i]);
int k=ask(1,1,n,dfn[a[i]]);
cout<<(k==1e18?-1:k)<<endl;
}
return 0;
}