#include<bits/stdc++.h>
using namespace std;
#define ll long long
int re(){
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*10+ch-'0';ch=getchar();}
return x*f;
}
void file(){
freopen("P1505_1.in","r",stdin);
freopen("zkr.ans","w",stdout);
}
const int N = 2e5+10;
int n,m,r,MOD,A[N],a[N],cnt,h[N];
struct edge{
int v,nxt,w;
}e[N<<1];
void adde(int u,int v,int w){
e[++cnt]={v,h[u],w};
h[u]=cnt;
}
int dep[N],siz[N],top[N],son[N],id[N],f[N],root;
void dfs1(int u,int fa){
f[u]=fa;
dep[u]=dep[fa]+1;
siz[u]=1;
for(int i=h[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=fa){
A[v]=e[i].w;
dfs1(v,u);
siz[u]+=siz[v];
if(!son[u]||siz[son[u]]<siz[v])son[u]=v;
}
}
}
void dfs2(int u,int num){
id[u]=++cnt;
a[cnt]=A[u];
top[u]=num;
if(!son[u])return;
dfs2(son[u],num);
for(int i=h[u];i;i=e[i].nxt){
int v=e[i].v;
if(v!=f[u]&&v!=son[u]){
dfs2(v,v);
}
}
}
struct node{
int maxn,minn,sum,tag;
}t[N<<2];
void pushup(int p){
t[p]={max(t[p<<1].maxn,t[p<<1|1].maxn),min(t[p<<1].minn,t[p<<1|1].minn),t[p<<1].sum+t[p<<1|1].sum,t[p].tag};
}
void build(int p,int l,int r){
t[p]={-1010,1010,0,0};
if(l==r){
t[p]={a[l],a[l],a[l],0};
return;
}
int mid = l+r >> 1;//dsadasfsa
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void change(int p){
t[p]={-t[p].minn,-t[p].maxn,-t[p].sum,t[p].tag^1};
}
void pushdown(int p){
if(t[p].tag){
change(p<<1);
change(p<<1|1);
t[p].tag=0;
}
}
void update_N(int p,int l,int r,int x,int y){
if(l>=x&&r<=y){change(p);return;}
int mid = l+r >> 1;
pushdown(p);
if(x<=mid)update_N(p<<1,l,mid,x,y);
if(y>mid)update_N(p<<1|1,mid+1,r,x,y);
pushup(p);
}
void update_C(int p,int l,int r,int x,int w){
if(l==r){
t[p]={w,w,w,0};
return;
}
int mid = l+r >> 1;
pushdown(p);
if(x<=mid)update_C(p<<1,l,mid,x,w);
if(x>mid)update_C(p<<1|1,mid+1,r,x,w);
pushup(p);
}
void update_range(int x,int y){//oppsite 0
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
update_N(1,1,n,id[top[x]],id[x]);
x=f[top[x]];
}
if(x!=y){
if(dep[x]>dep[y])swap(x,y);
update_N(1,1,n,id[x]+1,id[y]);
}
}
int query_sum(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return t[p].sum;
int mid = l+r >> 1,res=0;
pushdown(p);
if(x<=mid)res+=query_sum(p<<1,l,mid,x,y);
if(y>mid)res+=query_sum(p<<1|1,mid+1,r,x,y);
return res;
}
int query_min(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return t[p].minn;
int mid = l+r >> 1,res=1010;
pushdown(p);
if(x<=mid)res=min(res,query_min(p<<1,l,mid,x,y));
if(y>mid)res=min(res,query_min(p<<1|1,mid+1,r,x,y));
return res;
}
int query_max(int p,int l,int r,int x,int y){
if(l>=x&&r<=y)return t[p].maxn;
int mid = l+r >> 1,res=-1010;
pushdown(p);
if(x<=mid)res=max(res,query_max(p<<1,l,mid,x,y));
if(y>mid)res=max(res,query_max(p<<1|1,mid+1,r,x,y));
return res;
}
int query_range(int x,int y,int op){//sum 1 max 2 min 3
int res=0,maxn=-1010,minn=1010;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
if(op==1)res+=query_sum(1,1,n,id[top[x]],id[x]);
else if(op==2)maxn=max(maxn,query_max(1,1,n,id[top[x]],id[x]));
else minn=min(minn,query_min(1,1,n,id[top[x]],id[x]));
x=f[top[x]];
}
if(x!=y){
if(dep[x]>dep[y])swap(x,y);
if(op==1)res+=query_sum(1,1,n,id[x]+1,id[y]);
else if(op==2)maxn=max(maxn,query_max(1,1,n,id[x]+1,id[y]));
else minn=min(minn,query_min(1,1,n,id[x]+1,id[y]));
}
if(op==1)return res;
else if(op==2)return maxn;
else return minn;
}
struct gg{
int x,y;
}q[N];
int main(){
//file();
n=re();
for(int i=1;i<n;i++){
q[i].x=re()+1,q[i].y=re()+1;
int z=re();
adde(q[i].x,q[i].y,z);
adde(q[i].y,q[i].x,z);
}
cnt=0;
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
int m=re();
while(m--){
string s;
int i,j;
cin>>s;
i=re(),j=re();
if(s=="C"){update_C(1,1,n,dep[q[i].y]>dep[q[i].x]?id[q[i].y]:id[q[i].x],j);}
else if(s=="N")i++,j++,update_range(i,j);
else if(s=="SUM")cout<<query_range(i+1,j+1,1)<<endl;
else if(s=="MAX")cout<<query_range(i+1,j+1,2)<<endl;
else cout<<query_range(i+1,j+1,3)<<endl;
}
return 0;
}
void change(int p){
t[p]={-t[p].minn,-t[p].maxn,-t[p].sum,t[p].tag^1};
}
这块要异或,不能直接赋值为1
dep[q[i].y]>dep[q[i].x]?id[q[i].y]:id[q[i].x]
找深层的改!不能直接改id[q[i].y]!!!