求助调了好久!
#include <bits/stdc++.h>//ZPYV
using namespace std;
const int N = 800010;
int h[N],e[N],ne[N],w[N],idx,t[N],dep[N],id[N],cnt,top[N],sz[N],bs[N],k[N];
int x[N],y[N],z[N],seg[N],tag[N],mx[N],mi[N],fa[N],f[N];
void add(int a,int b,int c)
{
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int n;
void dfs(int u,int f)
{
dep[u]=dep[f]+1;
fa[u]=f;
int mx=0,iid=0;sz[u]++;
for(int i=h[u];i!=-1;i=ne[i])
{
if(e[i]!=f)
{
dfs(e[i],u);t[e[i]]=w[i];
sz[u]+=sz[e[i]];
if(sz[e[i]]>mx) mx=sz[e[i]],iid=e[i];
}
}
bs[u]=iid;
}
void dfs2(int u,int f,int tp)
{
id[u]=++cnt;
k[cnt]=t[u];
top[u]=tp;
if(bs[u]) dfs2(bs[u],u,tp);
for(int i=h[u];i!=-1;i=ne[i])
{
if(e[i]!=f && e[i]!=bs[u]) dfs2(e[i],u,e[i]);
}
}
void build(int l,int r,int u)
{
if(l==r)
{
seg[u]=k[l];
mx[u]=mi[u]=k[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,u<<1);
build(mid+1,r,u<<1|1);
seg[u]=seg[u<<1]+seg[u<<1|1];
mi[u]=min(mi[u<<1],mi[u<<1|1]);
mx[u]=max(mx[u<<1],mx[u<<1|1]);
}
void pd(int u,int l,int r)
{
if(f[u])
{
seg[u<<1]=-seg[u<<1];swap(mi[u<<1],mx[u<<1]);mi[u<<1]=-mi[u<<1];mx[u<<1]=-mx[u<<1];
seg[u<<1|1]=-seg[u<<1|1];swap(mi[u<<1|1],mx[u<<1|1]);
mi[u<<1|1]=-mi[u<<1|1];mx[u<<1|1]=-mx[u<<1|1];
f[u]=0;f[u<<1]^=1;f[u<<1|1]^=1;
}
}
void update(int l,int r,int ll,int rr,int u,int w)
{
if(l>=ll && r<=rr)
{
seg[u]=mi[u]=mx[u]=w;
return;
}
pd(u,l,r);
int mid=(l+r)>>1;
if(mid>=ll) update(l,mid,ll,rr,u<<1,w);
if(mid<rr) update(mid+1,r,ll,rr,u<<1|1,w);
seg[u]=seg[u<<1]+seg[u<<1|1];
mi[u]=min(mi[u<<1],mi[u<<1|1]);
mx[u]=max(mx[u<<1],mx[u<<1|1]);
}
void fan(int l,int r,int ll,int rr,int u)
{
if(l>=ll && r<=rr)
{
f[u]^=1;seg[u]=-seg[u];
swap(mi[u],mx[u]);
mi[u]=-mi[u];
mx[u]=-mx[u];
return;
}
pd(u,l,r);
int mid=(l+r)>>1;
if(mid>=ll) fan(l,mid,ll,rr,u<<1);
if(mid<rr) fan(mid+1,r,ll,rr,u<<1|1);
seg[u]=seg[u<<1]+seg[u<<1|1];
mi[u]=min(mi[u<<1],mi[u<<1|1]);
mx[u]=max(mx[u<<1],mx[u<<1|1]);
}
int query(int l,int r,int ll,int rr,int u)
{
if(l>=ll && r<=rr) return seg[u];
pd(u,l,r);
int mid=(l+r)>>1;
int ans=0;
if(mid>=ll) ans+=query(l,mid,ll,rr,u<<1);
if(mid<rr) ans+=query(mid+1,r,ll,rr,u<<1|1);
return ans;
}
int fdmax(int l,int r,int ll,int rr,int u)
{
if(l>=ll && r<=rr) return mx[u];
pd(u,l,r);
int mid=(l+r)>>1;
int ans=0;
if(mid>=ll) ans=max(ans,fdmax(l,mid,ll,rr,u<<1));
if(mid<rr) ans=max(ans,fdmax(mid+1,r,ll,rr,u<<1|1));
return ans;
}
int fdmin(int l,int r,int ll,int rr,int u)
{
if(l>=ll && r<=rr) return mi[u];
pd(u,l,r);
int mid=(l+r)>>1;
int ans=(int)1e9;
if(mid>=ll) ans=min(ans,fdmin(l,mid,ll,rr,u<<1));
if(mid<rr) ans=min(ans,fdmin(mid+1,r,ll,rr,u<<1|1));
return ans;
}
void updw(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
fan(1,n,id[top[x]],id[x],1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
fan(1,n,id[x]+1,id[y],1);
}
void qusum(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,n,id[top[x]],id[x],1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=query(1,n,id[x]+1,id[y],1);
printf("%d\n",ans);
}
void qumax(int x,int y)
{
int ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,fdmax(1,n,id[top[x]],id[x],1));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans=max(ans,fdmax(1,n,id[x]+1,id[y],1));
printf("%d\n",ans);
}
void qumin(int x,int y)
{
int ans=(int)1e9;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=min(ans,fdmin(1,n,id[top[x]],id[x],1));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans=min(ans,fdmin(1,n,id[x]+1,id[y],1));
printf("%d\n",ans);
}
int main()
{
scanf("%d",&n);
memset(h,-1,sizeof h);
for(int i=1;i<=n-1;i++)
{
int a,b,c;
a++,b++;
scanf("%d%d%d",&a,&b,&c);x[i]=a,y[i]=b,z[i]=c;
add(a,b,c);add(b,a,c);
}
dfs(1,1);
dfs2(1,1,1);
build(1,n,1);
int m;
scanf("%d",&m);
while(m--)
{
char s[4];
int a,b;
scanf("%s",s);
if(s[0]=='C')
{
scanf("%d%d",&a,&b);
if(dep[x[a]]>dep[y[a]]) update(1,n,id[x[a]],id[x[a]],1,b);
else update(1,n,id[y[a]],id[y[a]],1,b);
}
else if(s[0]=='N')
{
a++,b++;
scanf("%d%d",&a,&b);
updw(a,b);
}
else if(s[0]=='S')
{
a++,b++;
scanf("%d%d",&a,&b);
qusum(a,b);
}
else if(s[1]=='A')
{
a++,b++;
scanf("%d%d",&a,&b);
qumax(a,b);
}
else
{
a++,b++;
scanf("%d%d",&a,&b);
qumin(a,b);
}
}
}