只过了样例/kk
调一天了没调出来
#include<bits/stdc++.h>
#define int long long
#define le k<<1
#define ri k<<1|1
using namespace std;
const int N=1e6;
int n,m,x,y,z,num,cnt,o[N],fa[N],val[N],dep[N],siz[N],son[N],top[N],Num[N],head[N];
char op[20];
struct node{
int u,v,w,nxt;
}a[N<<1];
struct Node{
int l,r,len,dat,mx,mn,xo;
}t[N<<2];
void add(int u,int v,int w){
a[++cnt]=(node){u,v,w,head[u]};
head[u]=cnt;
}
inline int read(){
int f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-f;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return f*x;
}
int dfs1(int x,int fat){
dep[x]=dep[fat]+1;
fa[x]=fat;
siz[x]=1;
int Son=-1;
for(int i=head[x];i;i=a[i].nxt){
if(a[i].v==fat) continue;
val[a[i].v]=a[i].w;
siz[x]+=dfs1(a[i].v,x);
if(siz[a[i].v]>Son) Son=siz[a[i].v],son[x]=a[i].v;
}
return siz[x];
}
void dfs2(int x,int topf){
top[x]=topf;
Num[x]=++num;
o[num]=val[x];
if(!son[x]) return ;
dfs2(son[x],topf);
for(int i=head[x];i;i=a[i].nxt)
if(!Num[a[i].v])
dfs2(a[i].v,a[i].v);
}
void push_up(int k){t[k].dat=t[le].dat+t[ri].dat;t[k].mx=max(t[le].mx,t[ri].mx);t[k].mn=min(t[le].mn,t[ri].mn);}
void build(int k,int l,int r){
t[k].l=l;t[k].r=r;t[k].len=r-l+1;
if(l==r){
t[k].dat=t[k].mx=t[k].mn=val[l];
return ;
}
int mid=(t[k].l+t[k].r)>>1;
build(le,l,mid);
build(ri,mid+1,r);
push_up(k);
}
void pushdown(int k){
if(!t[k].xo) return ;
t[le].dat=-t[le].dat;
t[ri].dat=-t[ri].dat;
t[le].mn=-t[le].mn;
t[ri].mn=-t[ri].mn;
t[le].mx=-t[le].mx;
t[ri].mx=-t[ri].mx;
swap(t[le].mn,t[le].mx);
swap(t[ri].mn,t[ri].mx);
t[le].xo^=1;
t[ri].xo^=1;
t[k].xo^=1;
}
void ChangePoint(int k,int x,int v){
if(t[k].l==t[k].r){
t[k].dat=t[k].mn=t[k].mx=v;
return ;
}
pushdown(k);
int mid=(t[k].l+t[k].r)>>1;
if(x<=mid)
ChangePoint(le,x,v);
else ChangePoint(ri,x,v);
push_up(k);
}
void change(int k,int fl,int fr){
if(t[k].l>=fl&&t[k].r<=fr){
t[k].dat=-t[k].dat;
t[k].xo^=1;
t[k].mn=-t[k].mn;
t[k].mx=-t[k].mx;
swap(t[k].mn,t[k].mx);
return ;
}
pushdown(k);
int mid=(t[k].l+t[k].r)>>1;
if(fl<=mid)
change(le,fl,fr);
if(fr>mid)
change(ri,fl,fr);
push_up(k);
}
void changePath(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
change(1,Num[top[x]],Num[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
change(1,Num[x]+1,Num[y]);
}
int Query(int k,int fl,int fr){
if(t[k].l>=fl&&t[k].r<=fr)
return t[k].dat;
pushdown(k);
int ans=0,mid=(t[k].l+t[k].r)>>1;
if(fl<=mid)
ans+=Query(le,fl,fr);
if(fr>mid)
ans+=Query(ri,fl,fr);
return ans;
}
int QueryPath(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=Query(1,Num[top[x]],Num[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans+=Query(1,Num[x]+1,Num[y]);
return ans;
}
int Max(int k,int fl,int fr){
if(t[k].l>=fl&&t[k].r<=fr)
return t[k].mx;
pushdown(k);
int ans=-1e9,mid=(t[k].l+t[k].r)>>1;
if(fl<=mid)
ans=max(ans,Max(le,fl,fr));
if(fr>mid)
ans=max(ans,Max(ri,fl,fr));
return ans;
}
int QueryMax(int x,int y){
int ans=-1e9;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,Max(1,Num[top[x]],Num[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return max(ans,Max(1,Num[x]+1,Num[y]));
}
int Min(int k,int fl,int fr){
if(t[k].l>=fl&&t[k].r<=fr)
return t[k].mn;
pushdown(k);
int ans=1e9,mid=(t[k].l+t[k].r)>>1;
if(fl<=mid)
ans=min(ans,Min(le,fl,fr));
if(fr>mid)
ans=min(ans,Min(ri,fl,fr));
return ans;
}
int QueryMin(int x,int y){
int ans=1e9;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=min(ans,Min(1,Num[top[x]],Num[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
return min(ans,Min(1,Num[x]+1,Num[y]));
}
signed main()
{
n=read();
for(int i=1;i<n;i++){
x=read()+1;y=read()+1;z=read();
add(x,y,z);add(y,x,z);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
m=read();
for(int i=1;i<=m;i++){
scanf("%s",op);x=read()+1;y=read()+1;
if(op[0]=='C'){
x--;
int x1=a[x].u,x2=a[x].v;
if(dep[x1]<dep[x2])swap(x1,x2);
ChangePoint(1,Num[x1],y-1);
}
else if(op[0]=='N'){
changePath(x,y);
}
else if(op[0]=='S'){
printf("%lld\n",QueryPath(x,y));
}
else if(op[0]=='M'){
if(op[1]=='A')
printf("%lld\n",QueryMax(x,y));
if(op[1]=='I')
printf("%lld\n",QueryMin(x,y));
}
}
return 0;
}