蒟蒻崩溃,蒟蒻大哭,调了2h没调出来
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define debug cout<<tr[5].sum<<endl;
using namespace std;
const int N=4e5+10;
int n,u[N],v[N],w[N],bs,hea[N],m,siz[N],son[N],dep[N],f[N],c[N],ww,ans,id[N];
int d,tim,top[N],rk[N],x,y,ca;
struct lll {
int to,net,dis;
}lu[N];
struct qwe {
int ma,mi,sum;
bool tag;
}tr[N<<2];
char ch[10];
void jb(int a,int b,int c)
{
lu[++bs].to=b;
lu[bs].dis=c;
lu[bs].net=hea[a];
hea[a]=bs;
}
void dfs1(int x,int fa)
{
dep[x]=dep[fa]+1;
f[x]=fa;
siz[x]=1;
for(int i=hea[x];i;i=lu[i].net)
{
int y=lu[i].to;
if(y==f[x]) continue;
c[y]=lu[i].dis;
dfs1(y,x);
if(siz[y]>siz[son[x]]) son[x]=y;
siz[x]+=siz[y];
}
}
void dfs2(int x,int fa)
{
id[x]=++tim;
rk[tim]=c[x];
top[x]=fa;
if(son[x]) dfs2(son[x],fa);
for(int i=hea[x];i;i=lu[i].net)
{
int y=lu[i].to;
if(y==f[x]||y==son[x]) continue;
dfs2(y,y);
}
}
void push_up(int t)
{
tr[t].sum=tr[t<<1].sum+tr[t<<1|1].sum;
tr[t].ma=max(tr[t<<1].ma,tr[t<<1|1].ma);
tr[t].mi=min(tr[t<<1].mi,tr[t<<1|1].mi);
}
void biu(int t,int l,int r)
{
if(l==r)
{
tr[t].ma=rk[l];
tr[t].mi=rk[l];
tr[t].sum=rk[l];
return;
}
int mid=(l+r)>>1;
biu(t<<1,l,mid);
biu(t<<1|1,mid+1,r);
push_up(t);
}
void push_down(int t)
{
if(!tr[t].tag) return ;
tr[t<<1].tag^=1;
tr[t<<1|1].tag^=1;
tr[t<<1].sum=0-tr[t<<1].sum;
swap(tr[t<<1].ma,tr[t<<1].mi);
tr[t<<1].ma=0-tr[t<<1].ma;
tr[t<<1].mi=0-tr[t<<1].mi;
tr[t<<1|1].sum=0-tr[t<<1|1].sum;
swap(tr[t<<1|1].ma,tr[t<<1|1].mi);
tr[t<<1|1].ma=0-tr[t<<1|1].ma;
tr[t<<1|1].mi=0-tr[t<<1|1].mi;
tr[t].tag=0;
}
void change(int t,int l,int r,int x,int z)
{
if(l==r&&l==x)
{
tr[t].ma=z;
tr[t].mi=z;
tr[t].sum=z;
return;
}
push_down(t);
int mid=(l+r)>>1;
if(x<=mid) change(t<<1,l,mid,x,z);
if(x>mid) change(t<<1|1,mid+1,r,x,z);
push_up(t);
}
void change2(int t,int l,int r,int x,int y)
{
if(x<=l&&y>=r)
{
tr[t].tag^=1;
tr[t].sum=0-tr[t].sum;
swap(tr[t].ma,tr[t].mi);
tr[t].ma=0-tr[t].ma;
tr[t].mi=0-tr[t].mi;
return;
}
push_down(t);
int mid=(l+r)>>1;
if(x<=mid) change2(t<<1,l,mid,x,y);
if(y>mid) change2(t<<1|1,mid+1,r,x,y);
push_up(t);
}
int sum(int t,int l,int r,int x,int y)
{
if(x<=l&&y>=r) return tr[t].sum;
int an=0;
push_down(t);
int mid=(l+r)>>1;
if(x<=mid) an+=sum(t<<1,l,mid,x,y);
if(y>mid) an+=sum(t<<1|1,mid+1,r,x,y);
push_up(t);
return an;
}
int MA(int t,int l,int r,int x,int y)
{
if(x<=l&&y>=r) return tr[t].ma;
int an=-214748364;
push_down(t);
int mid=(l+r)>>1;
if(x<=mid) an=max(an,MA(t<<1,l,mid,x,y));
if(y>mid) an=max(an,MA(t<<1|1,mid+1,r,x,y));
push_up(t);
return an;
}
int MI(int t,int l,int r,int x,int y)
{
if(x<=l&&y>=r) return tr[t].mi;
int an=214748364;
push_down(t);
int mid=(l+r)>>1;
if(x<=mid) an=min(an,MA(t<<1,l,mid,x,y));
if(y>mid) an=min(an,MA(t<<1|1,mid+1,r,x,y));
push_up(t);
return an;
}
void cl2(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
change2(1,1,n,id[top[x]],id[x]);
x=f[top[x]];
}
if(id[x]>id[y]) swap(x,y);
if(x==y) return;
change2(1,1,n,id[x]+1,id[y]);
}
void cl3(int x,int y)
{
ans=0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=sum(1,1,n,id[top[x]],id[x]);
x=f[top[x]];
}
if(id[x]>id[y]) swap(x,y);
if(x==y) return;
ans+=sum(1,1,n,id[x]+1,id[y]);
printf("%d\n",ans);
}
void cl4(int x,int y)
{
ans=-214748367;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,(1,1,n,id[top[x]],id[x]));
x=f[top[x]];
}
if(id[x]>id[y]) swap(x,y);
if(x==y) return;
ans=max(ans,MA(1,1,n,id[x]+1,id[y]));
printf("%d\n",ans);
}
void cl5(int x,int y)
{
ans=214748364;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans=min(ans,MI(1,1,n,id[top[x]],id[x]));
x=f[top[x]];
}
if(id[x]>id[y]) swap(x,y);
if(x==y) return;
ans=min(ans,MI(1,1,n,id[x]+1,id[y]));
printf("%d\n",ans);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
u[i]++,v[i]++;
jb(u[i],v[i],w[i]);
jb(v[i],u[i],w[i]);
}
dfs1(1,0);
dfs2(1,1);
biu(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%s",ch);
if(ch[0]=='C')
{
scanf("%d%d",&x,&ww);
y=v[x];x=u[x];
if(id[x]>id[y]) swap(x,y);
change(1,1,n,id[y],ww);
}
else if(ch[0]=='N')
{
scanf("%d%d",&x,&y);
x++,y++;
cl2(x,y);
}
else if(ch[0]=='S')
{
scanf("%d%d",&x,&y);
x++;y++;
cl3(x,y);
}
else if(ch[1]=='A')
{
scanf("%d%d",&x,&y);
x++;y++;
cl4(x,y);
}
else if(ch[1]=='I')
{
scanf("%d%d",&x,&y);
x++;y++;
cl5(x,y);
}
}
return 0;
}