#include<bits/stdc++.h>
#define l(k) k*2
#define r(k) k*2+1
using namespace std;
struct node{
int l,r,lazy,Lazy,sum_l_1,sum_r_1,sum_l_0,sum_r_0,sum,sum_0;
}z[10000003];
int a[10000004];
int n,m;
void pushup(int k){
if(z[l(k)].sum_l_1==z[l(k)].r-z[l(k)].l+1){
z[k].sum_l_1=z[l(k)].sum_l_1+z[r(k)].sum_l_1;
}
else{
z[k].sum_l_1=z[l(k)].sum_l_1;
}
if(z[r(k)].sum_r_1==z[r(k)].r-z[r(k)].l+1){
z[k].sum_r_1=z[l(k)].sum_r_1+z[r(k)].sum_r_1;
}
else{
z[k].sum_r_1=z[r(k)].sum_r_1;
}
if(z[l(k)].sum_l_0==z[l(k)].r-z[l(k)].l+1){
z[k].sum_l_0=z[l(k)].sum_l_0+z[r(k)].sum_l_0;
}
else{
z[k].sum_l_0=z[l(k)].sum_l_0;
}
if(z[r(k)].sum_r_0==z[r(k)].r-z[r(k)].l+1){
z[k].sum_r_0=z[l(k)].sum_r_0+z[r(k)].sum_r_0;
}
else{
z[k].sum_r_0=z[r(k)].sum_r_0;
}
z[k].sum=z[l(k)].sum+z[r(k)].sum;
z[k].sum_0=z[l(k)].sum_0+z[r(k)].sum_0;
}
void lazzy(int k){
int l=l(k),r=r(k);
if(z[k].Lazy){
swap(z[l].sum,z[l].sum_0);
swap(z[l].sum_l_0,z[l].sum_l_1);
swap(z[l].sum_r_0,z[l].sum_r_1);
swap(z[r].sum,z[r].sum_0);
swap(z[r].sum_l_0,z[r].sum_l_1);
swap(z[r].sum_r_0,z[r].sum_r_1);
z[l].Lazy=z[l].Lazy^1;
z[r].Lazy=z[r].Lazy^1;
z[k].Lazy=0;
}
if(z[k].lazy!=-1){
int p=z[k].lazy;
if(!p){
z[l].sum=z[l].sum_l_1=z[l].sum_r_1=0;
z[l].sum_0=z[l].sum_l_0=z[l].sum_r_0=z[l].r-z[l].l+1;
z[r].sum=z[r].sum_l_1=z[r].sum_r_1=0;
z[r].sum_0=z[r].sum_l_0=z[r].sum_r_0=z[r].r-z[r].l+1;
}
if(p){
z[l].sum_0=z[l].sum_l_0=z[l].sum_r_0=0;
z[l].sum=z[l].sum_l_1=z[l].sum_r_1=(z[l].r-z[l].l+1);
z[r].sum_0=z[r].sum_l_0=z[r].sum_r_0=0;
z[r].sum=z[r].sum_l_1=z[r].sum_r_1=(z[r].r-z[r].l+1);
}
z[l].lazy=z[r].lazy=p;
z[k].lazy=-1;
}
}
void build(int l,int r,int k){
z[k].l=l;
z[k].r=r;
z[k].lazy=-1;
if(l==r){
if(a[l]){
z[k].sum++;
z[k].sum_l_1=z[k].sum_r_1=1;
}
if(!a[l]){
z[k].sum_0++;
z[k].sum_l_0=z[k].sum_r_0=1;
}
z[k].Lazy=0;
return ;
}
int mid=l+r>>1;
build(l,mid,l(k));
build(mid+1,r,r(k));
pushup(k);
}
void chang(int l,int r,int p,int k){
lazzy(k);
if(z[k].l>=l&&z[k].r<=r){
if(!p){
z[k].sum=z[k].sum_l_1=z[k].sum_r_1=0;
z[k].sum_0=z[k].sum_l_0=z[k].sum_r_0=z[k].r-z[k].l+1;
}
if(p){
z[k].sum=z[k].sum_l_1=z[k].sum_r_1=(z[k].r-z[k].l+1);
z[k].sum_0=z[k].sum_l_0=z[k].sum_r_0=0;
}
z[k].lazy=p;
return ;
}
int mid=z[k].l+z[k].r>>1;
if(l<=mid){
chang(l,r,p,l(k));
}
if(r>mid){
chang(l,r,p,r(k));
}
pushup(k);
}
void Chan(int l,int r,int k){
lazzy(k);
if(z[k].l>=l&&z[k].r<=r){
swap(z[k].sum,z[k].sum_0);
swap(z[k].sum_l_0,z[k].sum_l_1);
swap(z[k].sum_r_1,z[k].sum_r_0);
z[k].Lazy=1;
return ;
}
int mid=z[k].l+z[k].r>>1;
if(l<=mid){
Chan(l,r,l(k));
}
if(r>mid){
Chan(l,r,r(k));
}
pushup(k);
}
int find(int l,int r,int k){
lazzy(k);
if(z[k].l>=l&&z[k].r<=r){
return z[k].sum;
}
int mid=z[k].l+z[k].r>>1;
int sum=0;
if(l<=mid){
sum+=find(l,r,l(k));
}
if(r>mid){
sum+=find(l,r,r(k));
}
return sum;
}
int Find(int l,int r,int k){
lazzy(k);
if(z[k].l>=l&&z[k].r<=r){
int maxx;
maxx=z[l(k)].sum_r_1+z[r(k)].sum_l_1;
maxx=max(maxx,max(z[k].sum_l_1,z[k].sum_r_1));
return maxx;
}
int maxx=0;
int mid=z[k].r+z[k].l>>1;
if(l<=mid){
maxx=max(maxx,Find(l,r,l(k)));
}
if(r>mid){
maxx=max(maxx,Find(l,r,r(k)));
}
if(l<=mid&&r>mid){
maxx=max(maxx,min(z[l(k)].sum_r_1,mid-l+1)+min(z[r(k)].sum_l_1,r-mid));
}
return maxx;
}
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,n,1);
for(int i=1;i<=m;i++){
int opt,l,r;
scanf("%d%d%d",&opt,&l,&r);
l=l+1;
r=r+1;
if(opt==0){
chang(l,r,0,1);
}
if(opt==1){
chang(l,r,1,1);
}
if(opt==2){
Chan(l,r,1);
}
if(opt==3){
printf("%d\n",find(l,r,1));
}
if(opt==4){
printf("%d\n",Find(l,r,1));
}
}
}