萌新刚学线段树合并,求调板子。
捞原帖,改正了一个 bug,仍然是 25pts。
#include<bits/stdc++.h>
#define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=1e5+7;
int n,m,u,v,z;
struct edge {
int to,ne;
}e[N<<1];
int head[N],cnt;
inline void addedge(int u,int v) {e[++cnt]={v,head[u]}, head[u]=cnt; }
struct node{
node (int _l,int _r) :l(_l),r(_r),mx(0),mxid(0),ls(nullptr),rs(nullptr){}
int l,r,mx,mxid;
node *ls,*rs;
inline int getmid() { return (l+r)>>1; }
inline void pushup() {
mx=0,mxid=0;
if(ls!=nullptr) if(ls->mx>mx) mx=ls->mx,mxid=ls->mxid;
if(rs!=nullptr) if(rs->mx>mx) mx=rs->mx,mxid=rs->mxid;
}
};
vector<int> tag[N];
int dfn[N];
int st[N][20];
int fa[N];
void dfs(int u,int f) {
fa[u]=f;
dfn[u]=++dfn[0];
st[dfn[0]][0]=f;
for(int i=head[u];i;i=e[i].ne) {
int v=e[i].to;
if(v==f) continue;
dfs(v,u);
}
}
inline int _min(int l,int r) { return dfn[l]<dfn[r]?l:r; }
void init() {
int lg=__lg(n);
rep(k,1,lg) {
for(int i=1;i+(1<<k)-1<=n;i++) {
st[i][k]=_min(st[i][k-1],st[i+(1<<(k-1))][k-1]);
}
}
}
inline void getlca(int u,int v,int z) {
if(u==v) {
tag[u].push_back(z);
tag[fa[u]].push_back(-z);
return;
}
int mn=min(dfn[u],dfn[v])+1,mx=max(dfn[u],dfn[v]);
int lg=__lg(mx-mn+1);
int lca=_min(st[mn][lg],st[mx-(1<<lg)+1][lg]);
tag[u].push_back(z),tag[v].push_back(z);
tag[lca].push_back(-z),tag[fa[lca]].push_back(-z);
}
int ans[N];
void insert(node *u,int x,int val) {
if(u->l==u->r) {
u->mx+=val;
if(u->mx<=0) u->mxid=0;
else u->mxid=x;
return ;
}
int mid=u->getmid();
if(x<=mid) insert(u->ls==nullptr?u->ls=new node (u->l,mid):u->ls,x,val);
else insert(u->rs==nullptr?u->rs=new node(mid+1,u->r):u->rs,x,val);
u->pushup();
}
node * merge(node *x,node *y) {
if(x==nullptr) return y;
if(y==nullptr) return x;
if(x->l==x->r) {
x->mx+=y->mx;
if(x->mx<=0) x->mxid=0;
else x->mxid=x->l;
return x;
}
x->ls=merge(x->ls,y->ls),x->rs=merge(x->rs,y->rs);
x->pushup();
return x;
}
node * solve(int u) {
// pf("solve %d\n",u);
node *rt=new node(1,n);
for(int x:tag[u]) {
// pf("%d ",x);
if(x>0) insert(rt,x,1);
else insert(rt,-x,-1);
}
// pf("\n");
for(int i=head[u];i;i=e[i].ne) {
int v=e[i].to;
if(v==fa[u]) continue;
node * rtv=solve(v);
rt=merge(rt,rtv) ;
}
ans[u]=rt->mxid;
// pf("exit %d\n",u);
return rt;
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
sf("%d%d",&n,&m);
rep(i,1,n-1) {
sf("%d%d",&u,&v);
addedge(u,v); addedge(v,u);
}
dfs(1,0);
init();
rep(i,1,m) {
sf("%d%d%d",&u,&v,&z);
getlca(u,v,z);
}
// pf("???\n");
solve(1);
// pf("???\n");
rep(i,1,n) pf("%d\n",ans[i]);
}