已知:在部分数据下,assert(l<=r)会抛出异常 提交记录(变量名算清晰了吧?)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,INF=0x3f3f3f3f;
int head[N<<1],nex[N<<1],to[N<<1],val[N<<1];
int fa[N],son[N],top[N],sz[N],dp[N],id[N],wor[N],a[N];
int t_sum[N<<2],t_mx[N<<2],t_mn[N<<2];
bool change[N<<2];
int tot,n,cnt;
string op;
vector<pair<int,int>>e;
void add(int u,int v,int w){
nex[++tot]=head[u];
to[tot]=v;val[tot]=w;
head[u]=tot;
}
void dfs1(int x,int f,int deep){
dp[x]=deep;fa[x]=f;sz[x]=1;int mx=-1;
for(int i=head[x];i;i=nex[i]){
int y=to[i];
if(y==f)continue;
dfs1(y,x,deep+1);
sz[x]+=sz[y];a[y]=val[i];
sz[y]>mx&&(mx=sz[y],son[x]=y);
}
}
void dfs2(int x,int topf){
id[x]=++cnt;top[x]=topf;wor[cnt]=a[x];
if(!son[x])return;
dfs2(son[x],topf);
for(int i=head[x];i;i=nex[i]){
int y=to[i];
if(y==son[x]||y==fa[x])continue;
dfs2(y,y);
}
}
static inline int ls(int p){return p<<1;}
static inline int rs(int p){return p<<1|1;}
void push_up(int p){
t_sum[p]=t_sum[ls(p)]+t_sum[rs(p)];
t_mx[p]=max(t_mx[ls(p)],t_mx[rs(p)]);
t_mn[p]=min(t_mn[ls(p)],t_mn[rs(p)]);
}
void fix(int p){
change[p]^=1;
t_sum[p]=-t_sum[p];
t_mn[p]=-t_mx[p];
t_mx[p]=-t_mn[p];
}
void push_down(int p){
if(change[p])fix(ls(p)),fix(rs(p)),change[p]=0;
}
void build(int l=1,int r=n,int p=1){
if(l==r){t_sum[p]=t_mx[p]=t_mn[p]=wor[l];return;}
int mid=l+r>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
void updCover(int x,int k,int l=1,int r=n,int p=1){
if(l==r){t_sum[p]=t_mn[p]=t_mx[p]=k;return;}
int mid=l+r>>1;push_down(p);
if(x<=mid)updCover(x,k,l,mid,ls(p));
else updCover(x,k,mid+1,r,rs(p));
push_up(p);
}
void updChange(int x,int y,int l=1,int r=n,int p=1){
assert(x<=y);
if(x<=l&&r<=y){fix(p);return;}
int mid=l+r>>1;push_down(p);
if(x<=mid)updChange(x,y,l,mid,ls(p));
if(y>mid)updChange(x,y,mid+1,r,rs(p));
push_up(p);
}
int querySum(int x,int y,int l=1,int r=n,int p=1){
assert(x<=y);
if(x<=l&&r<=y)return t_sum[p];
int mid=l+r>>1,ans=0;push_down(p);
if(x<=mid)ans+=querySum(x,y,l,mid,ls(p));
if(y>mid)ans+=querySum(x,y,mid+1,r,rs(p));
return ans;
}
int queryMin(int x,int y,int l=1,int r=n,int p=1){
assert(x<=y);
if(x<=l&&r<=y)return t_mn[p];
int mid=l+r>>1,ans=INF;push_down(p);
if(x<=mid)ans=min(ans,queryMin(x,y,l,mid,ls(p)));
if(y>mid)ans=min(ans,queryMin(x,y,mid+1,r,rs(p)));
return ans;
}
int queryMax(int x,int y,int l=1,int r=n,int p=1){
assert(x<=y);
if(x<=l&&r<=y)return t_mx[p];
int mid=l+r>>1,ans=-INF;push_down(p);
if(x<=mid)ans=max(ans,queryMax(x,y,l,mid,ls(p)));
if(y>mid)ans=max(ans,queryMax(x,y,mid+1,r,rs(p)));
return ans;
}
void rangeChange(int x,int y){
while(top[x]!=top[y]){
if(dp[top[x]]<dp[top[y]])swap(x,y);
updChange(id[top[x]],id[x]);
x=fa[top[x]];
}
if(id[x]>id[y])swap(x,y);
// return;
// if(id[x]+1>id[y]){printf("%d %d\n",id[x]+1,id[y]);exit(0);}
// if(id[x]+1>id[y])return;
updChange(id[x]+1,id[y]);
}
int qSum(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dp[top[x]]<dp[top[y]])swap(x,y);
// if(id[top[x]]>id[x]){printf("%d %d\n",id[top[x]],id[x]);exit(0);}
ans+=querySum(id[top[x]],id[x]);
x=fa[top[x]];
}
if(id[x]>id[y])swap(x,y);
// return 1;
// if(id[x]+1>id[y])return ans;
return ans+=querySum(id[x]+1,id[y]);
}
int qMax(int x,int y){
int ans=-INF;
while(top[x]!=top[y]){
if(dp[top[x]]<dp[top[y]])swap(x,y);
ans=max(ans,queryMax(id[top[x]],id[x]));
x=fa[top[x]];
}
if(id[x]>id[y])swap(x,y);
// return 1;
// if(id[x]+1>id[y])return ans;
return max(ans,queryMax(id[x]+1,id[y]));
}
int qMin(int x,int y){
int ans=INF;
while(top[x]!=top[y]){
if(dp[top[x]]<dp[top[y]])swap(x,y);
ans=min(ans,queryMin(id[top[x]],id[x]));
x=fa[top[x]];
}
if(id[x]>id[y])swap(x,y);
// return 1;
// if(id[x]+1>id[y])return ans;
return min(ans,queryMin(id[x]+1,id[y]));
}
int main(){
int i,j,k,u,v,w,m;
memset(t_mn,0x3f,sizeof(t_mn));memset(t_mx,0xcf,sizeof(t_mx));
// freopen("P1505.in","r",stdin);
// freopen("P1505.out","w",stdout);
ios::sync_with_stdio(0);cin.tie(0);
for(cin>>n,i=1;i<n;i++)cin>>u>>v>>w,add(u+1,v+1,w),add(v+1,u+1,w),e.push_back({u+1,v+1});
dfs1(1,0,1);dfs2(1,1);build();
// for(int i=1;i<=n;i++)printf("%d ",id[i]);
// puts("");
for(cin>>m;m--;){
cin>>op>>u>>v;
if(op[0]=='C'){
int x=e[u-1].first,y=e[u-1].second;
if(dp[x]<dp[y])swap(x,y);
// printf("%d %d\n",x,y);
updCover(id[x],v);
}else if(op[0]=='N'){
rangeChange(u+1,v+1);
}else if(op[0]=='S'){
printf("%d\n",qSum(u+1,v+1));
}else if(op[1]=='A'){
printf("%d\n",qMax(u+1,v+1));
}else{
printf("%d\n",qMin(u+1,v+1));
}
// puts("OK");
}
return 0;
}