rt,不知道是哪里写假了
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define rint register int
using namespace std;
namespace IO{
#define File(x,y) freopen(#x,"r",stdin),freopen(#y,"w",stdout)
#define FileClose() fclose(stdin),fclose(stdout)
inline int read(){
int w=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
while(ch>='0'&&ch<='9'){w=(w<<3)+(w<<1)+(ch^48); ch=getchar();}
return w*f;
}
inline void write(int x,char ch='\n'){
static int sta[35]; int top=0;
if(x<0) putchar('-'),x=-x;
do{sta[++top]=x%10,x/=10;}while(x);
while(top) putchar(sta[top--]+48); putchar(ch);
}
}
using namespace IO;
namespace CL{
#define fill(x,y) memset(x,y,sizeof(x))
#define copy(x,y) memcpy(x,y,sizeof(y))
const int maxn=2e5+5; const ll inf=0x7ffffffffffffff;
int n,m;
ll val[maxn]; int uid[maxn];
char s[5];
struct data{int u,v;}a[maxn];
namespace Graph{
int head[maxn],id;
struct e{int v,w,next;}edge[maxn<<1];
inline void add(int u,int v,int w){
edge[++id]=(e){v,w,head[u]};
head[u]=id;
}
}using namespace Graph;
namespace SegmentTree{
#define lson p<<1
#define rson p<<1|1
struct node{
ll sum,mx,mn,tag;
node(){}
node(ll a,ll b,ll c){sum=a,mx=b,mn=c;}
inline void get(ll x){sum=mx=mn=x,tag=0;}
inline void rev(){tag^=1,sum=-sum,mx=-mx,mn=-mn,swap(mx,mn);}
inline node operator +(const node &x)const{
return node(sum+x.sum,max(mx,x.mx),min(mn,x.mn));
}
}t[maxn<<2];
inline void pushup(int p){t[p]=t[lson]+t[rson];}
inline void pushdown(int p){
if(t[p].tag){
t[lson].rev(),t[rson].rev();
t[p].tag=0;
}
}
void build(int p,int l,int r){
if(l==r) return t[p].get(val[uid[l]]),void();
int mid=(l+r)>>1;
build(lson,l,mid),build(rson,mid+1,r);
pushup(p);
}
void modify(int p,int l,int r,int pos,ll k){
if(l==r) return t[p].get(k),void();
pushdown(p);
int mid=(l+r)>>1;
if(pos<=mid) modify(lson,l,mid,pos,k);
else modify(rson,mid+1,r,pos,k);
pushup(p);
}
void update(int p,int l,int r,int tl,int tr){
if(tl<=l && r<=tr) return t[p].rev(),void();
pushdown(p);
int mid=(l+r)>>1;
if(tl<=mid) update(lson,l,mid,tl,tr);
if(tr>mid) update(rson,mid+1,r,tl,tr);
pushup(p);
}
node query(int p,int l,int r,int tl,int tr){
if(tl<=l && r<=tr) return t[p];
pushdown(p);
int mid=(l+r)>>1; node res=node(0,-inf,inf);
if(tl<=mid) res=res+query(lson,l,mid,tl,tr);
if(tr>mid) res=res+query(rson,mid+1,r,tl,tr);
return res;
}
}using namespace SegmentTree;
namespace TreeChain{
int dep[maxn],size[maxn],f[maxn],son[maxn],top[maxn],dfn[maxn],tim;
void dfs1(int u,int fa){
f[u]=fa,size[u]=1;
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v,w=edge[i].w;
if(v==fa) continue;
val[v]=w;
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]) son[u]=v;
}
}
void dfs2(int u,int topf){
top[u]=topf;
dfn[u]=++tim,uid[tim]=u;
if(!son[u]) return;
dfs2(son[u],topf);
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v==f[u] || v==son[u]) continue;
dfs2(v,v);
}
}
inline void uprange(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
update(1,1,n,dfn[top[x]],dfn[x]);
x=f[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) update(1,1,n,dfn[x]+1,dfn[y]);
}
inline node qrange(int x,int y){
node res=node(0,-inf,inf);
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
res=res+query(1,1,n,dfn[top[x]],dfn[x]);
x=f[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) res=res+query(1,1,n,dfn[x]+1,dfn[y]);
return res;
}
}using namespace TreeChain;
inline int main(){
n=read();
for(int i=1;i<n;i++){
int x=read()+1,y=read()+1,z=read();
add(x,y,z),add(y,x,z);
a[i]=(data){x,y};
}
dfs1(1,0),dfs2(1,1),build(1,1,n);
m=read();
while(m--){
scanf("%s",s+1); int x=read(),y=read();
if(s[1]=='C') modify(1,1,n,dep[a[x].u]>dep[a[x].v]?dfn[a[x].u]:dfn[a[x].v],y);
else{
x++,y++; node res=qrange(x,y);
if(s[1]=='N') uprange(x,y);
if(s[1]=='S') printf("%lld\n",res.sum);
if(s[1]=='M' && s[2]=='A') printf("%lld\n",res.mx);
if(s[1]=='M' && s[2]=='I') printf("%lld\n",res.mn);
}
}
return 0;
}
}
signed main(){return CL::main();}