rt,调处来左边的同学和左边的左边的同学和右边的同学吃键盘。
#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=1e5+10,maxm=1e6+10,mod=998244353;
int n,idtt,eu[maxn],ev[maxn],ew[maxn],dep[maxn],sz[maxn],fa[maxn],hs[maxn],lt[maxn],id[maxn];
int tmp[maxn],val[maxn],ad[maxn<<2],mx[maxn<<2],sm[maxn<<2];
vector<pii> e[maxn];
void dfs1(int u){
sz[u]=1;
for(auto &[v,w]:e[u]) if(v!=fa[u]){
fa[v]=u,val[v]=w,dep[v]=dep[u]+1,dfs1(v),sz[u]+=sz[v];
if(sz[v]>sz[hs[u]]) hs[u]=v;
}
}
void dfs2(int u){
if(!lt[u]) lt[u]=u;
lt[hs[u]]=lt[u],tmp[id[u]=++idtt]=val[u];
if(hs[u]) dfs2(hs[u]);
for(auto &[v,w]:e[u]) if(v!=fa[u]&&v!=hs[u]) dfs2(v);
}
inline void down(int id){
if(sm[id]!=INT_MAX)
sm[id<<1]=sm[id],sm[id<<1]=sm[id],ad[id<<1]=ad[id<<1|1]=0,
mx[id]=sm[id],sm[id]=INT_MAX;
else if(ad[id]){
if(sm[id<<1]!=INT_MAX) sm[id<<1]+=ad[id];
else ad[id<<1]+=ad[id];
if(sm[id<<1|1]!=INT_MAX) sm[id<<1|1]+=ad[id];
else ad[id<<1|1]+=ad[id];
mx[id]+=ad[id],ad[id]=0;
}
}
inline void pushup(int id){down(id<<1),down(id<<1|1),mx[id]=max(mx[id<<1],mx[id<<1|1]);}
void build(int id,int l,int r,int *tmp){
sm[id]=INT_MAX;
if(l==r){
mx[id]=tmp[l];
return;
}
int mid=l+r>>1;
build(id<<1,l,mid,tmp),build(id<<1|1,mid+1,r,tmp),pushup(id);
}
void add(int id,int l,int r,int lq,int rq,int x){
down(id);
if(lq<=l&&r<=rq){
ad[id]+=x;
return;
}
int mid=l+r>>1;
if(lq<=mid) add(id<<1,l,mid,lq,rq,x);
if(rq>mid) add(id<<1|1,mid+1,r,lq,rq,x);
pushup(id);
}
void same(int id,int l,int r,int lq,int rq,int x){
down(id);
if(lq<=l&&r<=rq){
sm[id]=x;
return;
}
int mid=l+r>>1;
if(lq<=mid) same(id<<1,l,mid,lq,rq,x);
if(rq>mid) same(id<<1|1,mid+1,r,lq,rq,x);
pushup(id);
}
int query(int id,int l,int r,int lq,int rq){
down(id);
if(lq<=l&&r<=rq) return mx[id];
int mid=l+r>>1,ans=0;
if(lq<=mid) ans=max(ans,query(id<<1,l,mid,lq,rq));
if(rq>mid) ans=max(ans,query(id<<1|1,mid+1,r,lq,rq));
return ans;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
rep(i,1,n-1){
cin>>eu[i]>>ev[i]>>ew[i];
e[eu[i]].push_back({ev[i],ew[i]}),e[ev[i]].push_back({eu[i],ew[i]});
}
dfs1(1),dfs2(1),build(1,1,n,tmp);
// rep(i,1,n) cout<<lt[i]<<" ";
// cout<<"]\n";
rep(o,1,1e5){
int u,v,k,w,ans=0;
string opt;
cin>>opt;
if(opt=="Stop") break;
if(opt=="Change") cin>>k>>w,u=eu[k],v=ev[k];
else{
cin>>u>>v;
if(opt!="Max") cin>>w;
}
for(;lt[u]!=lt[v];u=fa[lt[u]]){
if(dep[lt[u]]<dep[lt[v]]) swap(u,v);
if(opt=="Max") ans=max(ans,query(1,1,n,id[lt[u]],id[u]));
else (opt=="Add"?add:same)(1,1,n,id[lt[u]],id[u],w);
}
if(id[u]>id[v]) swap(u,v);
if(u!=v) if(opt=="Max") ans=max(ans,query(1,1,n,id[u]+1,id[v]));
else (opt=="Add"?add:same)(1,1,n,id[u]+1,id[v],w);
if(opt=="Max") cout<<ans<<'\n';
}
return 0;
}/*
4
1 2 8
1 3 7
3 4 9
Max 1 2
Max 1 3
Max 1 4
Max 2 3
Max 2 4
Max 3 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 1 2
Max 1 3
Max 1 4
Max 2 3
Max 2 4
Max 3 4
Stop
*/