蒟蒻写了个树剖,结果第 11,12 个点 A 了,其他全 WA。
求助。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,inf=1001;
int n,m,dfn[N],top[N],fa[N],son[N],siz[N],tot,w[N],pl[N];
char ch[10];
struct edge{int v,w,id;};
vector<edge> g[N];
struct tree{
int s,mx,mn,os;
}tr[N<<2];
#define ls (o<<1)
#define rs (o<<1|1)
void mul_1(int o){
tr[o].os^=1,tr[o].s*=-1;
int tmp=tr[o].mx;tr[o].mx=-tr[o].mn;tr[o].mn=-tmp;
}
void push_down(int o){
if(!tr[o].os)return;
mul_1(ls),mul_1(rs);
tr[o].os=0;
}
void push_up(int o){
tr[o].s=tr[ls].s+tr[rs].s;
tr[o].mx=max(tr[ls].mx,tr[rs].mx);
tr[o].mn=min(tr[ls].mn,tr[rs].mn);
}
void change(int o,int l,int r,int x,int v1,int v2,int v3){
if(l==r)return (void)(tr[o]={v1,v2,v3,0});
push_down(o);
int mid=l+r>>1;
if(x<=mid)change(ls,l,mid,x,v1,v2,v3);
else change(rs,mid+1,r,x,v1,v2,v3);
push_up(o);
}
void update(int o,int l,int r,int x,int y){
if(x>y)return;
if(x<=l&&r<=y)return (void)(mul_1(o));
push_down(o);
int mid=l+r>>1;
if(x<=mid)update(ls,l,mid,x,y);
if(y>mid)update(rs,mid+1,r,x,y);
push_up(o);
}
void Change(int u,int v){
while(top[u]!=top[v]){
if(dfn[u]<dfn[v])swap(u,v);
update(1,1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dfn[u]<dfn[v])swap(u,v);
update(1,1,n,dfn[v]+1,dfn[u]);
}
int query_mx(int o,int l,int r,int x,int y){
if(x>y)return -inf;
if(x<=l&&r<=y)return tr[o].mx;
push_down(o);
int mid=l+r>>1,mx=-inf;
if(x<=mid)mx=query_mx(ls,l,mid,x,y);
if(y>mid)mx=max(mx,query_mx(rs,mid+1,r,x,y));
return mx;
}
int Max(int u,int v){
int mx=-inf;
while(top[u]!=top[v]){
if(dfn[u]<dfn[v])swap(u,v);
mx=max(mx,query_mx(1,1,n,dfn[top[u]]+1,dfn[u]));
u=fa[top[u]];
}
if(dfn[u]<dfn[v])swap(u,v);
mx=max(mx,query_mx(1,1,n,dfn[v]+1,dfn[u]));
return mx;
}
int query_mn(int o,int l,int r,int x,int y){
if(x>y)return inf;
if(x<=l&&r<=y)return tr[o].mn;
push_down(o);
int mid=l+r>>1,mn=inf;
if(x<=mid)mn=query_mn(ls,l,mid,x,y);
if(y>mid)mn=min(mn,query_mn(rs,mid+1,r,x,y));
return mn;
}
int Min(int u,int v){
int mn=inf;
while(top[u]!=top[v]){
if(dfn[u]<dfn[v])swap(u,v);
mn=min(mn,query_mn(1,1,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dfn[u]<dfn[v])swap(u,v);
mn=min(mn,query_mn(1,1,n,dfn[v]+1,dfn[u]));
return mn;
}
int query_sum(int o,int l,int r,int x,int y){
if(x>y)return 0;
if(x<=l&&r<=y)return tr[o].s;
push_down(o);
int mid=l+r>>1,s=0;
if(x<=mid)s=query_sum(ls,l,mid,x,y);
if(y>mid)s+=query_sum(rs,mid+1,r,x,y);
return s;
}
int Sum(int u,int v){
int s=0;
while(top[u]!=top[v]){
if(dfn[u]<dfn[v])swap(u,v);
s+=query_sum(1,1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dfn[u]<dfn[v])swap(u,v);
s+=query_sum(1,1,n,dfn[v]+1,dfn[u]);
return s;
}
void dfs(int u){
int mx=0;siz[u]=1;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v;
if(v==fa[u])continue;
fa[v]=u;
pl[g[u][i].id]=v;
w[v]=g[u][i].w;
dfs(v);
siz[u]+=siz[v];
if(siz[v]>mx)mx=siz[v],son[u]=v;
}
}
void dfs2(int u,int head){
dfn[u]=++tot,top[u]=head;
if(u)change(1,1,n,tot,w[u],w[u],w[u]);
else change(1,1,n,tot,0,-inf,inf);
if(son[u])dfs2(son[u],head);
for(int i=0;i<g[u].size();i++){
int v=g[u][i].v;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
signed main(){
scanf("%d",&n);
for(int u,v,w,i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
g[u].push_back({v,w,i});
g[v].push_back({u,w,i});
}
dfs(0);
dfs2(0,0);
for(int i=1;i<n;i++)pl[i]=dfn[pl[i]];
scanf("%d",&m);
for(int x,y,i=1;i<=m;i++){
scanf("%s%d%d",ch,&x,&y);
if(ch[0]=='C')change(1,1,n,pl[x],y,y,y);
else if(ch[0]=='N')Change(x,y);
else if(ch[1]=='U')printf("%d\n",Sum(x,y));
else if(ch[1]=='A')printf("%d\n",Max(x,y));
else printf("%d\n",Min(x,y));
}
}