RT,12分,压行习惯严重,请见谅,代码如下:
#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N=2e5+10;char op[10];
int n,m,u[N],v[N],w[N],top[N],son[N],siz[N],fa[N],dfn[N],dep[N],val[N];struct edges{int v,w;};vector<edges>e[N];
void dfs1(int u){
siz[u]=1;for(edges x:e[u])if(x.v^fa[u]){
val[x.v]=x.w;dep[x.v]=dep[fa[x.v]=u]+1,dfs1(x.v),siz[u]+=siz[x.v],siz[x.v]>siz[son[u]]&&(son[u]=x.v);
}
}
void dfs2(int u,int t){
top[u]=t;dfn[u]=++dfn[0];if(son[u])dfs2(son[u],t);for(edges x:e[u])if((x.v^fa[u])&&(x.v^son[u]))dfs2(x.v,x.v);
}
namespace T{
int sum[N<<2],mx[N<<2],mn[N<<2],tag[N<<2];
void pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);mn[rt]=min(mn[rt<<1],mn[rt<<1|1]);
}
void pushtag(int rt){swap(mn[rt],mx[rt]);sum[rt]=-sum[rt];mn[rt]=-mn[rt];mx[rt]=-mx[rt];tag[rt]^=1;}
void pushdown(int rt){if(tag[rt])pushtag(rt<<1),pushtag(rt<<1|1),tag[rt]=0;}
void build(int l=1,int r=n,int rt=1){
if(l==r)return mx[rt]=sum[rt]=mn[rt]=val[l],void();int mid=(l+r)>>1;
build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);pushup(rt);
}
void update(int pos,int x,int l=1,int r=n,int rt=1){
if(l==r)return mx[rt]=sum[rt]=mn[rt]=x,void();pushdown(rt);int mid=(l+r)>>1;
if(pos<=mid)update(pos,x,l,mid,rt<<1);else update(pos,x,mid+1,r,rt<<1|1);pushup(rt);
}
void modify(int L,int R,int l=1,int r=n,int rt=1){
if(L<=l&&r<=R)return pushtag(rt);pushdown(rt);int mid=(l+r)>>1;
if(L<=mid)modify(L,R,l,mid,rt<<1);if(mid<R)modify(L,R,mid+1,r,rt<<1|1);pushup(rt);
}
int query_sum(int L,int R,int l=1,int r=n,int rt=1){
if(L<=l&&r<=R)return sum[rt];pushdown(rt);int mid=(l+r)>>1,s=0;
if(L<=mid)s+=query_sum(L,R,l,mid,rt<<1);if(mid<R)s+=query_sum(L,R,mid+1,r,rt<<1|1);return s;
}
int query_max(int L,int R,int l=1,int r=n,int rt=1){
if(L<=l&&r<=R)return mx[rt];pushdown(rt);int mid=(l+r)>>1,mx=-1e9;
if(L<=mid)mx=max(mx,query_max(L,R,l,mid,rt<<1));if(mid<R)mx=max(mx,query_max(L,R,mid+1,r,rt<<1|1));return mx;
}
int query_min(int L,int R,int l=1,int r=n,int rt=1){
if(L<=l&&r<=R)return mn[rt];pushdown(rt);int mid=(l+r)>>1,mn=1e9;
if(L<=mid)mn=min(mn,query_min(L,R,l,mid,rt<<1));if(mid<R)mn=min(mn,query_min(L,R,mid+1,r,rt<<1|1));return mn;
}
}
void update(int x,int y){T::update(dfn[dep[u[x]]>dep[v[x]]?u[x]:v[x]],y);}
void modify(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);T::modify(dfn[top[x]],dfn[x]);x=fa[top[x]];
}if(dep[x]<dep[y])swap(x,y);if(x^y)T::modify(dfn[y]+1,dfn[x]);
}
int query_sum(int x,int y){
int s=0;while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);s+=T::query_sum(dfn[top[x]],dfn[x]);x=fa[top[x]];
}if(dep[x]<dep[y])swap(x,y);if(x^y)s+=T::query_sum(dfn[y]+1,dfn[x]);return s;
}
int query_max(int x,int y){
int mx=-1e9;while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);mx=max(mx,T::query_max(dfn[top[x]],dfn[x]));x=fa[top[x]];
}if(dep[x]<dep[y])swap(x,y);if(x^y)mx=max(mx,T::query_max(dfn[y]+1,dfn[x]));return mx;
}
int query_min(int x,int y){
int mn=1e9;while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);mn=min(mn,T::query_min(dfn[top[x]],dfn[x]));x=fa[top[x]];
}if(dep[x]<dep[y])swap(x,y);if(x^y)mn=min(mn,T::query_min(dfn[y]+1,dfn[x]));return mn;
}
int main(){
scanf("%d",&n);for(int i=1;i<n;i++){
scanf("%d%d%d",&u[i],&v[i],&w[i]),e[++u[i]].push_back({++v[i],w[i]}),e[v[i]].push_back({u[i],w[i]});
}dfs1(dep[1]=1);dfs2(1,1);scanf("%d",&m);T::build();for(int x,y;m--;){
scanf("%s%d%d",op,&x,&y);if(op[0]=='C')update(x,y);else if(op[0]=='N')modify(++x,++y);
else if(op[0]=='S')printf("%d\n",query_sum(++x,++y));else if(op[1]=='A')printf("%d\n",query_max(++x,++y));
else printf("%d\n",query_min(++x,++y));
}
return 0;
}