如题,这玩意效率不是应该超高的吗?
#include<bits/stdc++.h>
typedef unsigned int i4;
const i4 MX=1000005<<2;
i4 n,m,N,D,cls[MX],flip[MX];
struct Node{i4 s0,s1,m0,m1,l0,l1,r0,r1;}A[MX];
Node operator+(const Node x,const Node y){
return {x.s0+y.s0,x.s1+y.s1,
std::max(std::max(x.m0,y.m0),x.r0+y.l0),
std::max(std::max(x.m1,y.m1),x.r1+y.l1),
x.l0+(x.s1?0:y.l0),x.l1+(x.s0?0:y.l1),
y.r0+(y.s1?0:x.r0),y.r1+(y.s0?0:x.r1)};
}void pup(i4 x){A[x]=A[x<<1]+A[x<<1|1];}
void upd(i4 x,const i4 cl,const i4 fl){
Node&X=A[x];
if(cl<2){const i4 l=cl*(X.s0+X.s1),r=(!cl)*(X.s0+X.s1);
X={r,l,r,l,r,l,r,l},cls[x]=cl,flip[x]=0;
}if(fl)std::swap(X.s0,X.s1),std::swap(X.m0,X.m1),
std::swap(X.l0,X.l1),std::swap(X.r0,X.r1),flip[x]^=1;
}void pdn(i4 x){
upd(x<<1,cls[x],flip[x]),upd(x<<1|1,cls[x],flip[x]);
cls[x]=2,flip[x]=0;
}void push(i4 l,i4 r){for(i4 i=D;i;i--)pdn(l>>i),pdn(r>>i);}
void mdf(i4 l,i4 r,const i4 cl,const i4 fl){
for(push(l+=N-1,r+=N+1);l^r^1;pup(l>>=1),pup(r>>=1)){
if(~l&1)upd(l^1,cl,fl);if(r&1)upd(r^1,cl,fl);
}while(l>>=1)pup(l);
}Node que(i4 l,i4 r){
Node L,R;L=R={0,0,0,0,0,0,0,0};
for(push(l+=N-1,r+=N+1);l^r^1;l>>=1,r>>=1){
if(~l&1)L=L+A[l^1];if(r&1)R=A[r^1]+R;
}return L+R;
}int main(){
std::ios::sync_with_stdio(0);std::cin.tie(0),std::cout.tie(0);
std::cin>>n>>m;N=1<<(D=std::__lg(n+1)+1);
for(i4 i=N+1,x;i<=N+n;i++)
std::cin>>x,A[i]={!x,x,!x,x,!x,x,!x,x},cls[i]=2;
for(i4 i=N-1;i;i--)pup(i),cls[i]=2;
while(m--){i4 op,x,y;std::cin>>op>>x>>y;++x;++y;
if(op<3){mdf(x,y,op,op==2);continue;}
Node X=que(x,y);std::cout<<(op==3?X.s1:X.m1)<<"\n";
}return 0;
}