只A了最后两个点
#include<bits/stdc++.h>
using namespace std;
#define re register
#define int long long
const int N=2e5+5;
int n,m,u[N],v[N],w,a,b;
int dep[N],top[N],id[N],wt[N],siz[N],fa[N],son[N],cnt,tmp[N];
int head[N],to[N<<1],nxt[N<<1],val[N<<1],tot;
int sum[N<<2],Min[N<<2],Max[N<<2],laz[N<<2];
string opt;
int read()
{
int r=0,f=1;
char c=getchar();
while(!isdigit(c))
{
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c))
{
r=(r<<1)+(r<<3)+c-48;
c=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
val[++tot]=w;
to[tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void dfs1(int f,int now)
{
dep[now]=dep[f]+1;
fa[now]=f;
siz[now]=1;
int hson=-1;
for(int i=head[now];i;i=nxt[i])
{
int v=to[i];
if(v==f) continue;
dfs1(now,v);
siz[now]+=siz[v];
tmp[v]=val[i];
if(siz[v]>hson)
{
hson=siz[v];
son[now]=v;
}
}
}
void dfs2(int now,int topf)
{
id[++cnt]=now;
wt[cnt]=tmp[now];
top[now]=topf;
// cout<<now<<endl;
if(!son[now]) return ;
dfs2(son[now],topf);
for(int i=head[now];i;i=nxt[i])
{
int v=to[i];
if(v==fa[now]||v==son[now]) continue;
dfs2(v,v);
}
}
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void pushup(int x)
{
sum[x]=sum[ls(x)]+sum[rs(x)];
Max[x]=max(Max[ls(x)],Max[rs(x)]);
Min[x]=min(Min[ls(x)],Min[rs(x)]);
}
void build(int p,int l,int r)
{
if(l==r)
{
Min[p]=wt[l];
Max[p]=wt[l];
sum[p]=wt[l];
return ;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
void push_down(int x)
{
laz[ls(x)]^=1;
laz[rs(x)]^=1;
sum[ls(x)]=-sum[ls(x)];
sum[rs(x)]=-sum[rs(x)];
Max[ls(x)]*=-1; Max[rs(x)]*=-1;
Min[ls(x)]*=-1; Min[rs(x)]*=-1;
swap(Max[ls(x)],Min[ls(x)]);
swap(Max[rs(x)],Min[rs(x)]);
laz[x]=0;
}
void updval(int p,int l,int r,int L,int k)
{
if(l==r)
{
sum[p]=k;
Max[p]=k;
Min[p]=k;
return ;
}
if(laz[p]) push_down(p);
int mid=(l+r)>>1;
if(L<=mid) updval(ls(p),l,mid,L,k);
else updval(rs(p),mid+1,r,L,k);
pushup(p);
}
void updop(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
laz[p]^=1;
sum[p]*=-1;
Max[p]*=-1;
Min[p]*=-1;
swap(Max[p],Min[p]);
return ;
}
if(laz[p]) push_down(p);
int mid=(l+r)>>1;
if(L<=mid) updop(ls(p),l,mid,L,R);
if(R>mid) updop(rs(p),mid+1,r,L,R);
pushup(p);
}
int querysum(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return sum[p];
if(laz[p]) push_down(p);
int mid=(l+r)>>1,res=0;
if(L<=mid) res+=querysum(ls(p),l,mid,L,R);
if(R>mid) res+=querysum(rs(p),mid+1,r,L,R);
pushup(p);
return res;
}
int querymin(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return Min[p];
if(laz[p]) push_down(p);
int mid=(l+r)>>1,res=2e9;
if(L<=mid) res=min(res,querymin(ls(p),l,mid,L,R));
if(R>mid) res=min(res,querymin(rs(p),mid+1,r,L,R));
pushup(p);
return res;
}
int querymax(int p,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return Max[p];
if(laz[p]) push_down(p);
int mid=(l+r)>>1,res=-2e9;
if(L<=mid) res=max(res,querymax(ls(p),l,mid,L,R));
if(R>mid) res=max(res,querymax(rs(p),mid+1,r,L,R));
pushup(p);
return res;
}
void updrangeop(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
updop(1,1,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) updop(1,1,n,id[x]+1,id[y]);
}
int qsum(int x,int y)
{
int ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=querysum(1,1,n,id[top[x]],id[x]);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) ans+=querysum(1,1,n,id[x]+1,id[y]);
return ans;
}
int qmax(int x,int y)
{
int ans=-2e9;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,querymax(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) ans=max(ans,querymax(1,1,n,id[x]+1,id[y]));
return ans;
}
int qmin(int x,int y)
{
int ans=2e9;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=min(ans,querymin(1,1,n,id[top[x]],id[x]));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x!=y) ans=min(ans,querymin(1,1,n,id[x]+1,id[y]));
return ans;
}
signed main()
{
n=read();
for(re int i=1;i<n;i++)
{
u[i]=read()+1;
v[i]=read()+1;
w=read();
add(u[i],v[i],w);
add(v[i],u[i],w);
}
dfs1(0,1);
dfs2(1,1);
// puts("");
// for(int i=1;i<=n;i++)
// printf("%d %d %d %d\n",id[i],wt[i],top[i],dep[i]);
build(1,1,n);
m=read();
while(m--)
{
cin>>opt;
a=read(); b=read();
if(opt[0]=='C')
{
if(dep[u[a]]>dep[v[a]]) updval(1,1,n,id[u[a]],b);
else updval(1,1,n,id[v[a]],b);
}
else if(opt[0]=='N') updrangeop(a+1,b+1);
else if(opt[1]=='U') printf("%lld\n",qsum(a+1,b+1));
else if(opt[1]=='A') printf("%lld\n",qmax(a+1,b+1));
else printf("%lld\n",qmin(a+1,b+1));
}
}
出去吃饭了,可能不能及时回复,敬请谅解