rt,调一天了,我真的很需要帮助
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+5; const ll inf=123456789123456789;
int n,m,cnt,t[N<<2]; ll dis[N],k[N<<1],b[N<<1],mn[N<<2];
int tim,dfn[N],dep[N],fa[N],siz[N],in[N],son[N],top[N],tot,head[N];
struct Edge{ int to,next,val; }e[N<<1];
void add_edge(int u,int v,int w){ e[++tot]={v,head[u],w},head[u]=tot; }
ll f(int i,ll x){ return k[i]*x+b[i]; }
int cmp(int i,int j,ll x){ return f(i,x)>f(j,x); }
inline int lc(int x){ return x<<1; }
inline int rc(int x){ return x<<1|1; }
void push_up(int x){ mn[x]=min(min(mn[lc(x)],mn[rc(x)]),mn[x]); }
void build(int x,int l,int r){
mn[x]=inf; if(l==r) return ; int mid=l+r>>1;
build(lc(x),l,mid),build(rc(x),mid+1,r);
}
void upd(int x,int l,int r,int u,int v,int p){
if(l>v||r<u) return ; int mid=l+r>>1;
mn[x]=min(mn[x],min(f(p,dis[max(u,l)]),f(p,dis[min(v,r)])));
if(l==r) return t[x]=cmp(p,t[x],dis[l])?t[x]:p,void();
if(u<=l&&r<=v){
if(cmp(p,t[x],dis[l])&&cmp(p,t[x],dis[r])) return ;
if(cmp(t[x],p,dis[l])&&cmp(t[x],p,dis[r])) return t[x]=p,void();
if(cmp(t[x],p,dis[mid])) swap(t[x],p);
if(cmp(t[x],p,dis[l])) upd(rc(x),mid+1,r,u,v,p);
else upd(lc(x),l,mid,u,v,p);
}else upd(lc(x),l,mid,u,v,p),upd(rc(x),mid+1,r,u,v,p); push_up(x);
}
ll ask(int x,int l,int r,int u,int v){
if(u<=l&&r<=v) return mn[x];
int mid=l+r>>1; ll ret=inf;
if(u<=mid) ret=min(ret,ask(lc(x),l,mid,u,v));
if(v>mid) ret=min(ret,ask(rc(x),mid+1,r,u,v));
return min(min(f(t[x],dis[max(u,l)]),f(t[x],dis[min(v,r)])),ret);
}
void dfs1(int u){ siz[u]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to; if(v==fa[u]) continue;
fa[v]=u,dep[v]=dep[u]+1,
dfs1(v),siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v,in[u]=e[i].val;
}
}
void dfs2(int u,int bl){ top[u]=bl;
if(son[u]) dis[dfn[son[u]]=++tim]=dis[dfn[u]]+in[u],dfs2(son[u],bl);
for(int i=head[u];i;i=e[i].next){ int v=e[i].to;
if((v^son[u])&&(v^fa[u]))
dis[dfn[v]=++tim]=dis[dfn[u]]+e[i].val,dfs2(v,v);
}
}
int lca(int x,int y){ for(;top[x]^top[y];dep[top[x]]>dep[top[y]]?x=fa[top[x]]:y=fa[top[y]]); return dep[x]>dep[y]?y:x; }
void modify(int x,int y,int p){ for(;top[x]^top[y];x=fa[top[x]]) upd(1,1,n,dfn[top[x]],dfn[x],p); upd(1,1,n,dfn[y],dfn[x],p); }
ll query(int x,int y){ ll ret=inf;
for(;top[x]^top[y];x=fa[top[x]]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret=min(ret,ask(1,1,n,dfn[top[x]],dfn[x]));
} if(dep[x]>dep[y]) swap(x,y); return min(ret,ask(1,1,n,dfn[x],dfn[y]));
}
int main(){ b[0]=inf;
scanf("%d%d",&n,&m),build(1,1,n);
for(int i=1;i<n;i++){
int u,v,w; scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w),add_edge(v,u,w);
} dfs1(1),dfs2(dfn[1]=++tim,1);
for(int i=1;i<=m;i++){
int op,x,y,p,q,_lca;
scanf("%d%d%d",&op,&x,&y);
if(op==1) _lca=lca(x,y),scanf("%d%d",&p,&q),
++cnt,k[cnt]=-p,b[cnt]=p*dis[_lca]+q,modify(x,_lca,cnt),
++cnt,k[cnt]=p,b[cnt]=p*(dis[x]-2*dis[_lca])+q,modify(y,_lca,cnt);
else printf("%lld\n",query(x,y));
}
return 0;
}