rt,调了 1.5h 了 qwq
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5e5+5;
struct edge{int to,nxt,w,u;}e[maxn];int cnt,n,u,v,w,tot,id[maxn],val[maxn],head[maxn],fa[maxn],top[maxn],son[maxn],siz[maxn],dep[maxn];
void add(int u,int v,int w){e[++cnt].to = v,e[cnt].u = u,e[cnt].w = w,e[cnt].nxt = head[u],head[u] = cnt;}
int tag1[maxn],tag2[maxn],t[maxn];string s;
void change1(int s,int l,int r,int k){t[s] = k * (r - l + 1),tag1[s] = k;}
void change2(int s,int l,int r,int k){t[s] += k * (r - l + 1),tag2[s] += k;}
void push_down(int s,int l,int r){
if(tag1[s] != -1) change1(s*2,l,(l+r)/2,tag1[s]),change1(s*2+1,(l+r)/2+1,r,tag1[s]),tag1[s] = -1;
change2(s*2,l,(l+r)/2,tag2[s]),change2(s*2+1,(l+r)/2+1,r,tag2[s]),tag2[s] = 0;
}
void update(int s,int l,int r,int ql,int qr,int k,int tp){
if(ql <= l && r <= qr) return (tp == 1 ? change1(s,l,r,k) : change2(s,l,r,k)),void();
int mid = (l + r) / 2;push_down(s,l,r);
if(ql <= mid) update(s*2,l,mid,ql,qr,k,tp); if(qr > mid) update(s*2+1,mid+1,r,ql,qr,k,tp);
t[s] = max(t[s*2],t[s*2+1]);
}
int query(int s,int l,int r,int ql,int qr){
if(ql <= l && r <= qr) return t[s];
int mid = (l + r) / 2,ans = 0;push_down(s,l,r);
if(ql <= mid) ans = max(ans,query(s*2,l,mid,ql,qr));
if(qr > mid) ans = max(ans,query(s*2+1,mid+1,r,ql,qr));
return ans;
}
void dfs1(int u,int fat){
fa[u] = fat,dep[u] = dep[fat] + 1,siz[u] = 1;
for(int i = head[u];i;i = e[i].nxt){
int v = e[i].to;if(v == fat) continue;
val[v] = e[i].w,dfs1(v,u),siz[u] += siz[v];if(siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(int u,int tp){
top[u] = tp,id[u] = ++tot,update(1,1,n,tot,tot,val[u],1);if(son[u]) dfs2(son[u],tp);
for(int i = head[u];i;i = e[i].nxt){int v = e[i].to;if(v != fa[u] && v != son[u]) dfs2(v,v);}
}
void updatee(int u,int v,int k,int tp){
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
update(1,1,n,id[top[u]],id[u],k,tp),u = fa[top[u]];
}
if(u == v) return ;
if(dep[u] > dep[v]) swap(u,v);
update(1,1,n,id[u]+1,id[v],k,tp);
}
int queryy(int u,int v){
int ans = 0;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u,v);
ans = max(ans,query(1,1,n,id[top[u]],id[u])),u = fa[top[u]];
}
if(u == v) return ans;
if(dep[u] > dep[v]) swap(u,v);
return max(ans,query(1,1,n,id[u]+1,id[v]));
}
signed main(){
cin >> n;memset(tag1,-1,sizeof(tag1));
for(int i = 1;i < n;i ++) cin >> u >> v >> w,add(u,v,w),add(v,u,w);
dfs1(1,0),dfs2(1,1);
while(cin >> s){
if(s[0] == 'S') break;
if(s[0] == 'C' && s[1] == 'h') cin >> u >> v,updatee(e[u*2].u,e[u*2].to,v,1);
if(s[0] == 'C' && s[1] == 'o') cin >> u >> v >> w,updatee(u,v,w,1);
if(s[0] == 'A') cin >> u >> v >> w,updatee(u,v,w,2);
if(s[0] == 'M') cin >> u >> v,cout << queryy(u,v) << "\n";
}
return 0;
}