咕咕咕。。。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}
const int N = 2e5 + 10;
struct node{int u ,v;}g[N];
struct Edge{int v ,len;Edge(int x ,int y){v = x ,len = y;}};
int mx[N] ,add[N] ,cov[N];
int top[N] ,id[N] ,sz[N] ,fa[N] ,son[N] ,dep[N] ,a[N] ,nw[N];
int n ,cnt;
vector <Edge> edge[N << 1];
inline void dfs1(int u ,int fath ,int len){
fa[u]= fath ,dep[u] = dep[fath] + 1 ,sz[u] = 1 ,a[u] = len;
for(int i = 0;i < edge[u].size();i ++)
if(edge[u][i].v != fath){
int v = edge[u][i].v;
dfs1(v ,u ,edge[u][i].len);
sz[u] += sz[v];
if(sz[son[u]] < sz[v]) son[u] = v;
}
} inline void dfs2(int u ,int tp){
top[u] = tp;
id[u] = ++ cnt;
nw[id[u]] = a[u];
if(!son[u]) return;
dfs2(son[u] , u);
for(int i = 0;i < edge[u].size();i ++){
int v = edge[u][i].v;
if(v == fa[u] || v == son[u]) continue;
else dfs2(v, v);
}
} inline void pushup(int u){mx[u] = max(mx[u << 1] ,mx[u << 1 | 1]); }
inline void pushdown(int u){
if(cov[u] != -1){
add[u << 1] = add[u << 1 | 1] = -1;
mx[u << 1] = mx[u << 1 | 1] = cov[u];
cov[u << 1] = cov[u << 1 | 1] = cov[u];
cov[u] = -1;
}
if(add[u]){
add[u << 1] += add[u];
add[u << 1 | 1] += add[u];
mx[u << 1] += mx[u];
mx[u << 1 | 1] += mx[u];
add[u] = 0;
}
} inline void build(int u ,int l ,int r){
cov[u] = -1;
if(l == r){mx[u] = nw[l];return;}
int mid = ((l + r) >> 1ll);
build(u << 1 ,l , mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
} inline void adds(int u ,int l ,int r ,int x ,int y ,int val){
if(l >= x && r <= y){
mx[u] += val;
add[u] += val;
return;
}
pushdown(u);
int mid = ((l + r) >> 1ll);
if(x <= mid) adds(u << 1 ,l ,mid ,x ,y ,val);
if(mid < y) adds(u << 1 | 1 ,mid + 1 ,r ,x, y ,val);
pushup(u);
} inline void change(int u ,int l ,int r ,int x, int y ,int val){
if(l >= x && r <= y){add[u] = 0;mx[u] = cov[u] = val;return;}
pushdown(u);
int mid = ((l + r) >> 1ll);
if(x <= mid) change(u << 1 ,l ,mid ,x ,y ,val);
if(mid < y) change(u << 1 | 1 , mid + 1 ,r ,x , y ,val);
pushup(u);
} inline int query(int u ,int l ,int r ,int x ,int y){
if(l >= x && r <= y) return mx[u];
pushdown(u);
int mid = ((l + r) >> 1ll) ,res = 0;
if(x <= mid) res = query(u << 1 , l ,mid ,x ,y);
if(mid < y) res = max(res ,query(u << 1 | 1 ,mid + 1 ,r ,x ,y));
return res;
} inline void modify(int u ,int v ,int val ,bool op){
//op = 0,表示覆盖;op = 1,表示区间加。
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u ,v);
if(!op) change(1, 1, n ,id[top[u]] ,id[u] ,val);
else adds(1 ,1, n ,id[top[u]] ,id[u] ,val);
u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u ,v);
if(u == v) return;
if(!op) change(1 ,1 ,n ,id[u] + 1 ,id[v] ,val);
else adds(1 ,1 ,n ,id[u] + 1 ,id[v] ,val);
} inline int ask(int u ,int v){
int res = 0;
while(top[u] != top[v]){
if(dep[top[u]] < dep[top[v]]) swap(u ,v);
res = max(res ,query(1 ,1, n ,id[top[u]] ,id[u]));
u = fa[top[u]];
}
if(dep[u] > dep[v]) swap(u ,v);
if(u == v) return res;
return max(res ,query(1 ,1, n ,id[u] + 1 ,id[v]));
}
signed main(){
n = read();
up(i,1,n - 1){
int u = read() ,v = read() , w = read();
g[i] = {u ,v};
edge[u].push_back((Edge){v ,w});
edge[v].push_back((Edge){u ,w});
}
dfs1(1 ,1 ,0);
dfs2(1, 1);
// up(i,1,n) writeln(top[i]);
build(1,1,n);
// up(i,1,n) writeln(top[i]);
while(1){
char op[10];
cin >> op;
if(op[0] == 'S') break;
if(op[0] == 'C' && op[1] == 'h'){
int i = read() ,v = read();
modify(g[i].u ,g[i].v ,v ,0);
} if(op[0] == 'C' && op[1] == 'o'){
int u = read() ,v = read() ,w = read();
modify(u ,v, w ,0);
} if(op[0] == 'A'){
int u = read() ,v = read() ,w = read();
modify(u ,v, w ,1);
} if(op[0] == 'M'){
int u = read() ,v = read();
writeln(ask(u ,v));
}
}
return 0;
}
/*
3 5
1 2
3 4
2 2
1 5
1 4
*/