rt
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
struct node{
int sum;
int lx0,rx0,len0;
int lx1,rx1,len1;
}tr[N<<2];
int tag[N<<2],rev[N<<2];
node pushup(node lc,node rc,int pl,int pr)
{
int mid=(pl+pr)>>1;
node res;
res.sum=lc.sum+rc.sum;
res.lx0=lc.lx0+rc.lx0*(mid-pl+1==lc.lx0);
res.rx0=rc.rx0+lc.rx0*(pr-mid==rc.rx0);
res.len0=max({lc.len0,rc.len0,lc.rx0+rc.lx0});
res.lx1=lc.lx1+rc.lx1*(mid-pl+1==lc.lx1);
res.rx1=rc.rx1+lc.rx1*(pr-mid==rc.rx1);
res.len1=max({lc.len1,rc.len1,lc.rx1+rc.lx1});
return res;
}
void addtag1(int p,int pl,int pr)
{
rev[p]^=1;
tr[p].sum=pr-pl+1-tr[p].sum;
swap(tr[p].lx0,tr[p].lx1);
swap(tr[p].rx0,tr[p].rx1);
swap(tr[p].len0,tr[p].len1);
}
void addtag2(int p,int pl,int pr,int d)
{
tag[p]=d;
tr[p].sum=tr[p].lx1=tr[p].rx1=tr[p].len1=d*(pr-pl+1);
tr[p].lx0=tr[p].rx0=tr[p].len0=(d^1)*(pr-pl+1);
}
void pushdown(int p,int pl,int pr)
{
int mid=(pl+pr)>>1;
if(~tag[p])
{
addtag2(p<<1,pl,mid,tag[p]);
addtag2(p<<1|1,mid+1,pr,tag[p]);
tag[p]=-1;
}
if(rev[p])
{
addtag1(p<<1,pl,mid);
addtag1(p<<1|1,mid+1,pr);
rev[p]=0;
}
}
void build(int p,int pl,int pr)
{
tag[p]=-1;
rev[p]=0;
if(pl==pr)
{
tr[p].sum=tr[p].lx1=tr[p].rx1=tr[p].len1=a[pl];
tr[p].lx0=tr[p].rx0=tr[p].len0=a[pl]^1;
return ;
}
int mid=(pl+pr)>>1;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
tr[p]=pushup(tr[p<<1],tr[p<<1|1],pl,pr);
}
void update1(int p,int pl,int pr,int L,int R)
{
if(R<pl||pr<L)
return ;
if(L<=pl&&pr<=R)
{
addtag1(p,pl,pr);
return ;
}
int mid=(pl+pr)>>1;
pushdown(p,pl,pr);
update1(p<<1,pl,mid,L,R);
update1(p<<1|1,mid+1,pr,L,R);
tr[p]=pushup(tr[p<<1],tr[p<<1|1],pl,pr);
}
void update2(int p,int pl,int pr,int L,int R,int d)
{
if(R<pl||pr<L)
return ;
if(L<=pl&&pr<=R)
{
addtag2(p,pl,pr,d);
return ;
}
int mid=(pl+pr)>>1;
pushdown(p,pl,pr);
update2(p<<1,pl,mid,L,R,d);
update2(p<<1|1,mid+1,pr,L,R,d);
tr[p]=pushup(tr[p<<1],tr[p<<1|1],pl,pr);
}
node query(int p,int pl,int pr,int L,int R)
{
if(R<pl||pr<L)
return (node){0,0,0,0,0,0,0};
if(L<=pl&&pr<=R)
return tr[p];
int mid=(pl+pr)>>1;
pushdown(p,pl,pr);
return pushup(query(p<<1,pl,mid,L,R),query(p<<1|1,mid+1,pr,L,R),pl,pr);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
build(1,1,n);
while(m--)
{
int op,l,r;
cin>>op>>l>>r;
++l,++r;
if(op==0)
update2(1,1,n,l,r,0);
if(op==1)
update2(1,1,n,l,r,1);
if(op==2)
update1(1,1,n,l,r);
if(op==3)
cout<<query(1,1,n,l,r).sum<<'\n';
if(op==4)
cout<<query(1,1,n,l,r).len1<<'\n';
}
}