#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,a[1100000];
struct as{
int a,l;
int s,lm,rm,m,f;
int s0,lm0,rm0,m0,f0;
}t[4400000];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
as qw(as l,as r){
as p;
p.a=-1;
p.l=l.l+r.l;
if(l.f){
p.lm=l.s+r.lm;
}
else{
p.lm=l.lm;
}
if(r.f){
p.rm=r.s+l.rm;
}
else{
p.rm=r.rm;
}
p.s=l.s+r.s;
p.m=max({ p.lm , p.rm , l.m , r.m , l.rm+r.lm });
if(l.f&&r.f){
p.f=1;
}
else{
p.f=0;
}
//////////////////
if(l.f0){
p.lm0=l.s0+r.lm0;
}
else{
p.lm0=l.lm0;
}
if(r.f0){
p.rm0=r.s0+l.rm0;
}
else{
p.rm0=r.rm0;
}
p.s0=l.s0+r.s0;
p.m0=max({ p.lm0 , p.rm0 , l.m0 , r.m0 , l.rm0+r.lm0 });
if(l.f0&&r.f0){
p.f0=1;
}
else{
p.f0=0;
}
return p;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void we(int d,int l,int r){
if(t[d].a==-1){
return;
}
if(t[d].a==2){
t[d*2].a=t[d].a;
swap(t[d*2].f,t[d*2].f0);
swap(t[d*2].m,t[d*2].m0);
swap(t[d*2].lm,t[d*2].lm0);
swap(t[d*2].rm,t[d*2].rm0);
swap(t[d*2].s,t[d*2].s0);
t[d*2+1].a=t[d].a;
swap(t[d*2+1].f,t[d*2+1].f0);
swap(t[d*2+1].m,t[d*2+1].m0);
swap(t[d*2+1].lm,t[d*2+1].lm0);
swap(t[d*2+1].rm,t[d*2+1].rm0);
swap(t[d*2+1].s,t[d*2+1].s0);
}
else if(t[d].a==1||t[d].a==0){
t[d*2].f=t[d*2].a=t[d].a;
t[d*2].s=t[d*2].lm=t[d*2].rm=t[d*2].m=t[d].a*t[d*2].l;
t[d*2].f0=t[d].a^1;
t[d*2].s0=t[d*2].lm0=t[d*2].rm0=t[d*2].m0=(t[d].a^1)*t[d*2].l;
t[d*2+1].f=t[d*2+1].a=t[d].a;
t[d*2+1].s=t[d*2+1].lm=t[d*2+1].rm=t[d*2+1].m=t[d].a*t[d*2+1].l;
t[d*2+1].f0=t[d].a^1;
t[d*2+1].s0=t[d*2+1].lm0=t[d*2+1].rm0=t[d*2+1].m0=(t[d].a^1)*t[d*2+1].l;
}
t[d].a=-1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void js(int d,int l,int r){
if(l==r){
t[d].l=1;
t[d].lm=t[d].rm=t[d].m=t[d].s=a[l]*t[d].l;
t[d].f=a[l];
t[d].lm0=t[d].rm0=t[d].m0=t[d].s0=(a[l]^1)*t[d].l;
t[d].f0=a[l]^1;
t[d].a=-1;
return;
}
int h=(l+r)/2;
js(d*2,l,h);
js(d*2+1,h+1,r);
t[d]=qw(t[d*2],t[d*2+1]);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void xg(int d,int l,int r,int q){
if(x<=l&&r<=y){
if(q==2){
t[d].a=q;
swap(t[d].f,t[d].f0);
swap(t[d].m,t[d].m0);
swap(t[d].lm,t[d].lm0);
swap(t[d].rm,t[d].rm0);
swap(t[d].s,t[d].s0);
return;
}
t[d].f=t[d].a=q;
t[d].s=t[d].lm=t[d].rm=t[d].m=q*t[d].l;
t[d].f0=q^1;
t[d].s0=t[d].lm0=t[d].rm0=t[d].m0=(q^1)*t[d].l;
return;
}
we(d,l,r);
int h=(l+r)/2;
if(x<=h){
xg(d*2,l,h,q);
}
if(h<y){
xg(d*2+1,h+1,r,q);
}
t[d]=qw(t[d*2],t[d*2+1]);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int cx(int d,int l,int r){
if(x<=l&&r<=y){
return t[d].s;
}
we(d,l,r);
int h=(l+r)/2,k=0;
if(x<=h){
k+=cx(d*2,l,h);
}
if(h<y){
k+=cx(d*2+1,h+1,r);
}
t[d]=qw(t[d*2],t[d*2+1]);
return k;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
as cs(int d,int l,int r){
if(x<=l&&r<=y){
return t[d];
}
we(d,l,r);
int h=(l+r)/2;
if(x<=h&&h<y){
return qw(cs(d*2,l,h),cs(d*2+1,h+1,r));
}
if(y<=h){
return cs(d*2,l,h);
}
if(h<x){
return cs(d*2+1,h+1,r);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
js(1,1,n);
while(m--){
int q;
scanf("%d%d%d",&q,&x,&y);
x++;
y++;
if(q==0||q==1||q==2){
xg(1,1,n,q);
}
else if(q==3){
printf("%d\n",cx(1,1,n));
}
else{
printf("%d\n",cs(1,1,n).m);
}
}
return 0;
}