hlcg @ 2024-12-20 19:40:13
rt
#include<bits/stdc++.h>
#define int long long
#define lc p<<1
#define rc p<<1|1
#define N 100010
using namespace std;
struct lsx{
int l,r,s1,s0,l1,l0,r1,r0,m1,m0;
int lbchange,lbqufan;//change-1/0/1,qufan0/1
}a[N*4];
int n,m;
int w[N+10];
void pp(lsx& a,lsx i,lsx j){
a.s1=i.s1+j.s1;
a.s0=i.s0+j.s0;
a.l1=(i.s0?i.l1:i.s1+j.l1);
a.l0=(i.s1?i.l0:i.s0+j.l0);
a.r1=(j.s0?j.r1:j.s1+i.r1);
a.r0=(j.s1?j.r0:j.s0+i.r0);
a.m1=max(max(i.m1,j.m1),i.r1+j.l1);
a.m0=max(max(i.m0,j.m0),i.r0+j.l0);
return ;
}
void pd(int p,int k){
if(k==1){
int len=a[p].r-a[p].l+1;
a[p]={a[p].l,a[p].r,len,0,len,0,len,0,len,0,-1,0};
return ;
}
if(k==0){
int len=a[p].r-a[p].l+1;
a[p]={a[p].l,a[p].r,0,len,0,len,0,len,0,len,-1,0};
return ;
}
if(k==2){//qf
swap(a[p].l0,a[p].l1);
swap(a[p].m0,a[p].m1);
swap(a[p].r0,a[p].r1);
swap(a[p].s0,a[p].s1);
a[p].lbqufan^=1;
return ;
}
}
void pushdown(int p){
if(a[p].lbqufan==1){
pd(lc,2);
pd(rc,2);
}
if(a[p].lbchange==1){
pd(lc,1);
pd(rc,1);
}
if(a[p].lbchange==0){
pd(lc,0);
pd(rc,0);
}
a[p].lbchange=-1;
a[p].lbqufan=0;
return ;
}
void build(int p,int l,int r){
a[p].l=l;
a[p].r=r;
a[p].lbchange=-1;
if(l==r){
if(w[l]==0){
a[p].l0=1;
a[p].m0=1;
a[p].r0=1;
a[p].s0=1;
}else{
a[p].l1=1;
a[p].m1=1;
a[p].r1=1;
a[p].s1=1;
}
return ;
}
int mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
pp(a[p],a[lc],a[rc]);
return ;
}
void change(int p,int x,int y,int k){
if(x<=a[p].l&&a[p].r<=y){
pd(p,k);
return ;
}
if(y<a[p].l||a[p].r<x){
return ;
}
pushdown(p);
change(lc,x,y,k);
change(rc,x,y,k);
pp(a[p],a[lc],a[rc]);
return ;
}
lsx re(int p,int x,int y){
if(y<a[p].l||a[p].r<x){
return {};
}
if(x<=a[p].l&&a[p].r<=y){
return a[p];
}
pushdown(p);
lsx T;
pp(T,re(lc,x,y),re(rc,x,y));
return T;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>w[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
int k,x,y;
cin>>k>>x>>y;
x++,y++;
if(k<3){
change(1,x,y,k);
}else{
lsx T;
T=re(1,x,y);
cout<<(k==3 ? (T.s1) : (T.m1-1));
puts("");
}
}
return 0;
}