呜呜呜
呜哇,咳咳,呜呜呜
为什么一直RE!!!呜呜呜
洛谷!你为什么要这么对我!!啊~呜呜呜·
(这孩子调了4个小时调疯了)
#include<bits/stdc++.h>
#include<cstdio>
#define LL long long
using namespace std;
inline LL read(){
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+(ch-'0'),ch=getchar();
return x*f;
}
LL n,m;
vector<LL>bian[200200][3];
LL siz[200200],son[200200],fa[200200],top[200200],dep[200200],a[200200],seg[200200],rev[200200],seg_size=0;
LL B[200200][3];
void dfs1(LL now,LL f,LL qz){
dep[now]=dep[f]+1;fa[now]=f;siz[now]=1;a[now]=qz;
LL l1=0;
for(LL i=0;i<bian[now][0].size();i++)
if(bian[now][0][i]!=f){
dfs1(bian[now][0][i],now,bian[now][1][i]);
siz[now]+=siz[bian[now][0][i]];
if(siz[bian[now][0][i]]>l1)son[now]=bian[now][0][i],l1=siz[bian[now][0][i]];
}
return ;
}
void dfs2(LL now,LL Top){
top[now]=Top;seg[now]=++seg_size;rev[seg_size]=now;
if(son[now])dfs2(son[now],Top);
for(LL i=0;i<bian[now][0].size();i++)
if(bian[now][0][i]!=fa[now]&&bian[now][0][i]!=son[now])
dfs2(bian[now][0][i],bian[now][0][i]);
return;
}
LL sum[200300<<5][4],add[200300<<5],TNT=0;
void build(LL l,LL r,LL now){
if(l==r){
sum[now][0]=sum[now][1]=sum[now][2]=a[rev[++TNT]];return;
}
LL mid=(l+r)>>1;
build(l,mid,now<<1);build(mid+1,r,now<<1|1);
sum[now][0]=sum[now<<1][0]+sum[now<<1|1][0];
sum[now][1]=max(sum[now<<1][1],sum[now<<1|1][1]);
sum[now][2]=min(sum[now<<1][2],sum[now<<1|1][2]);
return;
}
void Add(LL now){
add[now]=add[now]==0? 1:0;
swap(sum[now][1],sum[now][2]);
sum[now][0]=0-sum[now][0];
sum[now][1]=0-sum[now][1];
sum[now][2]=0-sum[now][2];
}
void pushdown(LL now){
if(add[now]==0)return;
Add(now<<1);Add(now<<1|1);
add[now]=0;
return;
}
void Add2(LL now,LL v){
sum[now][0]=sum[now][1]=sum[now][2]=v;
return;
}
void modify(LL l,LL r,LL x,LL y,LL now){;
if(l>=x&&r<=y)return Add(now);
LL mid=(l+r)>>1;
pushdown(now);
if(x<=mid)modify(l,mid,x,y,now<<1);
if(y>mid)modify(mid+1,r,x,y,now<<1|1);
sum[now][0]=sum[now<<1][0]+sum[now<<1|1][0];
sum[now][1]=max(sum[now<<1][1],sum[now<<1|1][1]);
sum[now][2]=min(sum[now<<1][2],sum[now<<1|1][2]);
return ;
}
void modify2(LL l,LL r,LL now,LL x,LL v){
if(l==r&&l==x)return Add2(now,v);
pushdown(now);
LL mid=(l+r)>>1;
if(x<=mid) modify2(l,mid,now<<1,x,v);
if(x>mid) modify2(mid+1,r,now<<1|1,x,v);
sum[now][0]=sum[now<<1][0]+sum[now<<1|1][0];
sum[now][1]=max(sum[now<<1][1],sum[now<<1|1][1]);
sum[now][2]=min(sum[now<<1][2],sum[now<<1|1][2]);
return;
}
LL query(LL l,LL r,LL x,LL y,LL now,LL v){
if(x<=l&&y>=r)return sum[now][v];
LL mid=(l+r)>>1;
pushdown(now);
if(x<=mid&&y>=mid){
if(v==0)return query(l,mid,x,y,now<<1,v)+query(mid+1,r,x,y,now<<1|1,v);
if(v==1)return max(query(l,mid,x,y,now<<1,v),query(mid+1,r,x,y,now<<1|1,v));
if(v==2)return min(query(l,mid,x,y,now<<1,v),query(mid+1,r,x,y,now<<1|1,v));
}
if(x<=mid&&y<=mid) return query(l,mid,x,y,now<<1,v);
return query(mid+1,r,x,y,now<<1|1,v);
}
int main(){
n=read();
for(LL i=1;i<n;i++){
LL l1=read()+1,l2=read()+1,l3=read();
B[i][0]=l1;B[i][1]=l2;
bian[l1][0].push_back(l2);bian[l1][1].push_back(l3);
bian[l2][0].push_back(l1);bian[l2][1].push_back(l3);
}
dep[1]=0;
dfs1(1,1,0);
dfs2(1,1);
build(1,n,1);
m=read();
char ch;
for(LL i=1;i<=m;i++){
ch=getchar();
while(ch<'A'||ch>'Z')ch=getchar();
if(ch=='C'){
LL l3=read(),l4=read();
if(B[l3][0]==fa[B[l3][1]])swap(B[l3][0],B[l3][1]);
modify2(1,n,1,seg[B[l3][0]],l4);
}
if(ch=='N'){
LL l3=read()+1,l4=read()+1;
while(top[l3]!=top[l4]){
if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
modify(1,n,seg[top[l3]],seg[l3],1);
l3=fa[top[l3]];
}
if(dep[l3]>dep[l4])swap(l3,l4);
modify(1,n,seg[l3],seg[l4],1);
}
if(ch=='S'){
LL l3=read()+1,l4=read()+1,WSND=0;
while(top[l3]!=top[l4]){
if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
WSND+=query(1,n,seg[top[l3]],seg[l3],1,0);
l3=fa[top[l3]];
}
if(dep[l3]>dep[l4])swap(l3,l4);
WSND+=query(1,n,seg[l3],seg[l4],1,0);
printf("%lld\n",WSND);
}
if(ch=='M'){
ch=getchar();
if(ch=='A'){
LL l3=read()+1,l4=read()+1,WSND=0;
while(top[l3]!=top[l4]){
if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
WSND=max(WSND,query(1,n,seg[top[l3]],seg[l3],1,1));
l3=fa[top[l3]];
}
if(dep[l3]>dep[l4])swap(l3,l4);
WSND=max(WSND,query(1,n,seg[l3],seg[l4],1,1));
printf("%lld\n",WSND);
}
else{
LL l3=read()+1,l4=read()+1,WSND=0;
while(top[l3]!=top[l4]){
if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
WSND=min(WSND,query(1,n,seg[top[l3]],seg[l3],1,2));
l3=fa[top[l3]];
}
if(dep[l3]>dep[l4])swap(l3,l4);
WSND=min(WSND,query(1,n,seg[l3],seg[l4],1,2));
printf("%lld\n",WSND);
}
}
}
return 0;
}
为啥,为啥样例没事啊!!!呜~