代码略显丑陋,daolao不喜勿喷
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int kM=2e5+5;
ll sl,sr,d,i,n,x,y,z,p,q,root,cnt,num,t[kM],f[kM],id[kM],top[kM],sz[kM],dis[kM],ne[kM<<1],to[kM<<1],ed[kM];
string o;
struct T{
ll sum,ma,mi,laz;
}tr[kM<<3];
bool h[kM];
void add(){
ne[++cnt]=ed[x],to[cnt]=y,ed[x]=cnt;
swap(x,y);
if(cnt&1)add();
return;
}
void dfs1(ll rt,ll fa){
ll i,ans=0;
f[rt]=fa,sz[rt]=1,dis[rt]=dis[fa]+1;
for(i=ed[rt];i;i=ne[i]){
if(fa!=to[i]){
dfs1(to[i],rt);
sz[rt]+=sz[to[i]];
if(sz[to[i]]>sz[ans])ans=to[i];
}
}
h[ans]=1;
return;
}
void dfs2(ll rt,ll fa){
ll i;
id[rt]=++num;
if(!h[rt])top[rt]=rt;
else top[rt]=top[fa];
for(i=ed[rt];i;i=ne[i]){
if(fa!=to[i]&&h[to[i]]){
dfs2(to[i],rt);
}
}
for(i=ed[rt];i;i=ne[i]){
if(fa!=to[i]&&!h[to[i]]){
dfs2(to[i],rt);
}
}
return;
}
void laz_tag(ll rt,ll l,ll r,ll mid){
swap(tr[rt<<1].ma,tr[rt<<1].mi);
tr[rt<<1].sum*=-1,tr[rt<<1].ma*=-1,tr[rt<<1].mi*=-1;
tr[rt<<1].laz^=1;
swap(tr[rt<<1|1].ma,tr[rt<<1|1].mi);
tr[rt<<1|1].sum*=-1,tr[rt<<1|1].ma*=-1,tr[rt<<1|1].mi*=-1;
tr[rt<<1|1].laz^=1;
tr[rt].laz=0;
return;
}
void update(ll rt,ll l,ll r){
ll mid=(l+r)>>1;
if(tr[rt].laz)laz_tag(rt,l,r,mid);
if(sl<=l&&r<=sr){
tr[rt].sum=tr[rt].ma=tr[rt].mi=d;
return;
}
if(sl<=mid)update(rt<<1,l,mid);
if(mid<sr)update(rt<<1|1,mid+1,r);
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
tr[rt].ma=max(tr[rt<<1].ma,tr[rt<<1|1].ma);
tr[rt].mi=min(tr[rt<<1].mi,tr[rt<<1|1].mi);
return;
}
void sd(ll rt,ll l,ll r){
ll mid=(l+r)>>1;
if(tr[rt].laz)laz_tag(rt,l,r,mid);
if(sl<=l&&r<=sr){
swap(tr[rt].ma,tr[rt].mi);
tr[rt].sum*=-1,tr[rt].ma*=-1,tr[rt].mi*=-1;
tr[rt].laz^=1;
return;
}
if(sl<=mid)sd(rt<<1,l,mid);
if(mid<sr)sd(rt<<1|1,mid+1,r);
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
tr[rt].ma=max(tr[rt<<1].ma,tr[rt<<1|1].ma);
tr[rt].mi=min(tr[rt<<1].mi,tr[rt<<1|1].mi);
return;
}
ll push_down(ll rt,ll l,ll r){
ll mid=(l+r)>>1,ret=0;
if(tr[rt].laz)laz_tag(rt,l,r,mid);
if(o=="SUM"){
if(sl<=l&&r<=sr){
return tr[rt].sum;
}
if(sl<=mid)ret+=push_down(rt<<1,l,mid);
if(mid<sr)ret+=push_down(rt<<1|1,mid+1,r);
}
else if(o=="MAX"){
ret=-1e18;
if(sl<=l&&r<=sr){
return tr[rt].ma;
}
if(sl<=mid)ret=max(ret,push_down(rt<<1,l,mid));
if(mid<sr)ret=max(ret,push_down(rt<<1|1,mid+1,r));
}
else{
ret=1e18;
if(sl<=l&&r<=sr){
return tr[rt].ma;
}
if(sl<=mid)ret=min(ret,push_down(rt<<1,l,mid));
if(mid<sr)ret=min(ret,push_down(rt<<1|1,mid+1,r));
}
tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
tr[rt].ma=max(tr[rt<<1].ma,tr[rt<<1|1].ma);
tr[rt].mi=min(tr[rt<<1].mi,tr[rt<<1|1].mi);
return ret;
}
void lca_u(ll x,ll y){
while(top[x]!=top[y]){
if(dis[top[x]]<dis[top[y]])swap(x,y);
sl=id[top[x]],sr=id[x];
sd(1,1,n);
x=f[top[x]];
}
if(x==y)return;
if(dis[x]>dis[y])swap(x,y);
sl=id[x]+1,sr=id[y];
sd(1,1,n);
return;
}
ll lca_p(ll x,ll y){
ll ans=0;
if(o=="MAX")ans=-1e18;
if(o=="MIN")ans=1e18;
while(top[x]!=top[y]){
if(dis[top[x]]<dis[top[y]])swap(x,y);
sl=id[top[x]],sr=id[x];
if(o=="SUM")ans+=push_down(1,1,n);
else if(o=="MIN")ans=min(ans,push_down(1,1,n));
else ans=max(ans,push_down(1,1,n));
x=f[top[x]];
}
if(x==y)return ans;
if(dis[x]>dis[y])swap(x,y);
sl=id[x]+1,sr=id[y];
if(o=="SUM")ans+=push_down(1,1,n);
else if(o=="MIN")ans=min(ans,push_down(1,1,n));
else ans=max(ans,push_down(1,1,n));
return ans;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(i=1;i<n;i++){
cin>>x>>y>>t[i];
x++,y++;
add();
}
dfs1(1,0);
dfs2(1,0);
for(i=1;i<n;i++){
d=t[i];
sl=sr=dis[to[(i<<1)-1]]>dis[to[i<<1]]?id[to[(i<<1)-1]]:id[to[(i<<1)]];
update(1,1,n);
}
cin>>q;
while(q--){
cin>>o;
if(o=="C"){
cin>>x>>d;
sl=sr=dis[to[(x<<1)-1]]>dis[to[x<<1]]?id[to[(x<<1)-1]]:id[to[(x<<1)]];
update(1,1,n);
}
else if(o=="N"){
cin>>x>>y;
x++,y++;
lca_u(x,y);
}
else{
cin>>x>>y;
x++,y++;
cout<<lca_p(x,y)<<"\n";
}
}
return 0;
}