那就快来帮帮我吧QWQ
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,r,p,fa[N],siz[N],son[N],deep[N],top[N],id[N],cnt,w[N],h[N],tot;
struct EDge {
int u,v,d,next;
}e[N*2];
void add (int u,int v,int d){
e[++tot].u=u;
e[tot].v=v;
e[tot].d=d;
e[tot].next=h[u];
h[u]=tot;
}
struct TREE {
int l,r,d,lazy,mx,mi;
}t[N*4];
void build (int k,int l,int r){
t[k].l=l;
t[k].r=r;
int mid=(l+r)>>1;
if (l==r){
t[k].d=t[k].mi=t[k].mx=w[l];
return;
}
build (k*2,l,mid);
build (k*2+1,mid+1,r);
t[k].d=(t[k*2].d+t[k*2+1].d);
t[k].mi=min(t[k*2].mi,t[k*2+1].mi);
t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
}
void xr (int k){
t[k].d*=-1;
if (t[k].lazy==0){
t[k].lazy=-1;
}
else {
t[k].lazy=0;
}
int kkk=t[k].mx;
t[k].mx=-1*t[k].mi;
t[k].mi=-1*kkk;
}
void pushdown(int k){
if (t[k].l!=t[k].r&&t[k].lazy==-1){
xr(k*2);
xr(k*2+1);
}
t[k].lazy=0;
}
void change (int k,int l,int r){
if (t[k].l>r||t[k].r<l){
return;
}
if (t[k].r<=r&&t[k].l>=l){
xr(k);
return;
}
pushdown(k);
change (k*2,l,r);
change (k*2+1,l,r);
t[k].d=(t[k*2].d+t[k*2+1].d);
t[k].mi=min(t[k*2].mi,t[k*2+1].mi);
t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
}
void change2 (int k,int x,int d){
if (t[k].l>x||t[k].r<x){
return;
}
if (t[k].r==x&&t[k].l==x){
t[k].d=t[k].mi=t[k].mx=d;
return;
}
pushdown(k);
change2 (k*2,x,d);
change2 (k*2+1,x,d);
t[k].d=(t[k*2].d+t[k*2+1].d);
t[k].mi=min(t[k*2].mi,t[k*2+1].mi);
t[k].mx=max(t[k*2].mx,t[k*2+1].mx);
}
int query (int k,int l,int r){
if (t[k].l>r||t[k].r<l){
return 0;
}
if (t[k].r<=r&&t[k].l>=l){
return t[k].d;
}
pushdown(k);
return (query(k*2,l,r)+query(k*2+1,l,r));
}
int qmx (int k,int l,int r){
if (t[k].l>r||t[k].r<l){
return -2147483647;
}
if (t[k].r<=r&&t[k].l>=l){
return t[k].mx;
}
pushdown(k);
return max(qmx(k*2,l,r),qmx(k*2+1,l,r));
}
int qmi (int k,int l,int r){
if (t[k].l>r||t[k].r<l){
return 2147483647;
}
if (t[k].r<=r&&t[k].l>=l){
return t[k].mi;
}
pushdown(k);
return min(qmi(k*2,l,r),qmi(k*2+1,l,r));
}
void dfs1 (int x,int f,int dep){
fa[x]=f;
int mx=0;
siz[x]=1;
deep[x]=dep;
for (int i=h[x];i;i=e[i].next){
int y=e[i].v;
if (y!=f){
dfs1(y,x,dep+1);
siz[x]+=siz[y];
if (siz[y]>mx){
mx=siz[y];
son[x]=y;
}
}
}
}
void dfs2(int x,int tp){
id[x]=++cnt;
top[x]=tp;
if (son[x]){
dfs2(son[x],tp);
}
for (int i=h[x];i;i=e[i].next){
int y=e[i].v;
if (y!=fa[x]){
if (y!=son[x]){
dfs2(y,y);
}
w[id[y]]=e[i].d;
}
}
}
void crange (int u,int v){
while (top[u]!=top[v]){
if (deep[top[u]]<deep[top[v]]){
swap(u,v);
}
change (1,id[top[u]],id[u]);
u=fa[top[u]];
}
if (deep[u]>deep[v]){
swap(u,v);
}
change (1,id[u]+1,id[v]);
}
int qrange (int u,int v){
int ans=0;
while (top[u]!=top[v]){
if (deep[top[u]]<deep[top[v]]){
swap(u,v);
}
ans=(ans+query(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if (deep[u]>deep[v]){
swap(u,v);
}
return (ans+query(1,id[u]+1,id[v]));
}
int mxrange (int u,int v){
int ans=-2147483647;
while (top[u]!=top[v]){
if (deep[top[u]]<deep[top[v]]){
swap(u,v);
}
ans=max(ans,qmx(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if (deep[u]>deep[v]){
swap(u,v);
}
return max(ans,qmx(1,id[u]+1,id[v]));
}
int mirange (int u,int v){
int ans=2147483647;
while (top[u]!=top[v]){
if (deep[top[u]]<deep[top[v]]){
swap(u,v);
}
ans=min(ans,qmi(1,id[top[u]],id[u]));
u=fa[top[u]];
}
if (deep[u]>deep[v]){
swap(u,v);
}
return min(ans,qmi(1,id[u]+1,id[v]));
}
int main (){
// freopen ("111.in","r",stdin);
// freopen ("111.out","w",stdout);
scanf ("%d",&n);
for (int i=1;i<n;i++){
int x,y,kk;
scanf ("%d %d %d",&x,&y,&kk);
add(x+1,y+1,kk);
add(y+1,x+1,kk);
}
scanf ("%d",&m);
dfs1(1,0,1);
dfs2(1,1);
build (1,1,n);
while (m--){
string opt;
cin>>opt;
if (opt=="C"){
int i,p;
scanf ("%d %d",&i,&p);
int x=e[i*2].u,y=e[i*2].v;
if (fa[x]==y){
change2(1,id[x],p);
}
else {
change2(1,id[y],p);
}
}
else if (opt=="N"){
int x,y;
scanf ("%d %d",&x,&y);
crange(x+1,y+1);
}
else if (opt=="SUM"){
int x,z;
scanf ("%d %d",&x,&z);
printf ("%d\n",qrange(x+1,z+1));
}
else if (opt=="MAX"){
int x,y;
scanf ("%d%d",&x,&y);
printf ("%d\n",mxrange(x+1,y+1));
}
else {
int x,y;
scanf ("%d%d",&x,&y);
printf ("%d\n",mirange(x+1,y+1));
}
}
return 0;
}