#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e5+20,MAXX=1e9;
int n,m,a[N];
struct node{
ll num,cnt,sum,tg,l,r,fr,en,cntz,sumz,frz,enz;
friend node operator + (node x,node y){
node z;
z.l=x.l,z.r=y.r;
z.cnt=max({x.cnt,y.cnt,x.en+y.fr});
z.cntz=max({x.cntz,y.cntz,x.enz+y.frz});
z.num=-1;
z.sum=x.sum+y.sum;
z.sumz=x.sumz+y.sumz;
z.tg=0;
if(x.fr==x.r-x.l+1){
z.fr=x.fr+y.fr;
}
else{
z.fr=x.fr;
}
if(y.en==y.r-y.l+1){
z.en=x.en+y.en;
}
else{
z.en=y.en;
}
if(x.frz==x.r-x.l+1){
z.frz=x.frz+y.frz;
}
else{
z.frz=x.frz;
}
if(y.enz==y.r-y.l+1){
z.enz=x.enz+y.enz;
}
else{
z.enz=y.enz;
}
return z;
}
friend node operator - (node x,node y){
node z;
z.num=y.num;
if(y.num!=-1){
if(y.num==1){
z.sum=x.r-x.l+1;
z.cnt=x.r-x.l+1;
z.en=x.r-x.l+1;
z.fr=x.r-x.l+1;
z.sumz=0;
z.cntz=0;
z.enz=0;
z.frz=0;
z.tg=0;
}
else{
z.sumz=x.r-x.l+1;
z.cntz=x.r-x.l+1;
z.enz=x.r-x.l+1;
z.frz=x.r-x.l+1;
z.sum=0;
z.cnt=0;
z.en=0;
z.fr=0;
z.tg=0;
}
z.l=x.l;
z.r=x.r;
return z;
}
else{
return x;
}
}
friend node operator * (node x,node y){
node z;
if(y.num==1){
z=x-y;
}
else if(y.num==0){
z=x-y;
}
else if(y.num==-1){
z.sum=x.sumz;
z.cnt=x.cntz;
z.fr=x.frz;
z.en=x.enz;
z.sumz=x.sum;
z.cntz=x.cnt;
z.frz=x.fr;
z.enz=x.en;
z.l=x.l;
z.r=x.r;
z.num=x.num;
}
if(x.tg==1){
z.tg=0;
}
else{
z.tg=1;
}
return z;
}
}tr[N*3];
void build(ll p,ll l,ll r){
if(l==r){
if(a[l]==1){
tr[p].sum=1;
tr[p].cnt=1;
tr[p].tg=0;
tr[p].en=1;
tr[p].fr=1;
tr[p].l=l;
tr[p].r=r;
tr[p].num=-1;
}
else{
tr[p].sumz=1;
tr[p].cntz=1;
tr[p].tg=0;
tr[p].enz=1;
tr[p].frz=1;
tr[p].l=l;
tr[p].r=r;
tr[p].num=-1;
}
return;
}
ll mid=l+r>>1;
build(p<<1,l,mid);
build((p<<1)+1,mid+1,r);
tr[p]=tr[p<<1]+tr[(p<<1)+1];
}
void givc(ll now,node p){
tr[now]=tr[now]-p;
}
void pc(ll now){
if(tr[now].num!=-1){
givc(now<<1,tr[now]);
givc((now<<1)+1,tr[now]);
tr[now].tg=0;
tr[now].num=-1;
}
}
void give(ll now,node p){
tr[now]=tr[now]*p;
}
void pd(ll now){
if(tr[now].tg==1){
give(now<<1,tr[now]);
give((now<<1)+1,tr[now]);
tr[now].tg=0;
tr[now].num=-1;
}
else{
pc(now);
tr[now].tg=0;
tr[now].num=-1;
}
}
void change(ll p,ll x,ll y,ll k){
if(tr[p].l>=x&&tr[p].r<=y){
tr[p].num=k;
givc(p,tr[p]);
tr[p].tg=0;
return;
}
pd(p);
ll mid=tr[p].l+tr[p].r>>1;
if(x<=mid){
change(p<<1,x,y,k);
}
if(y>mid){
change((p<<1)+1,x,y,k);
}
ll tg=tr[p].tg;
ll num=tr[p].num;
tr[p]=tr[p<<1]+tr[(p<<1)+1];
tr[p].tg=tg;
tr[p].num=num;
}
void xo(ll p,ll x,ll y){
if(tr[p].l>=x&&tr[p].r<=y){
if(tr[p].tg==1){
tr[p].tg=0;
}
else{
tr[p].tg=1;
}
if(tr[p].num==1){
tr[p].num==0;
tr[p].sumz=tr[p].r-tr[p].l+1;
tr[p].cntz=tr[p].r-tr[p].l+1;
tr[p].enz=tr[p].r-tr[p].l+1;
tr[p].frz=tr[p].r-tr[p].l+1;
tr[p].sum=0;
tr[p].cnt=0;
tr[p].en=0;
tr[p].fr=0;
}
else if(tr[p].num==0){
tr[p].num=1;
tr[p].sum=tr[p].r-tr[p].l+1;
tr[p].cnt=tr[p].r-tr[p].l+1;
tr[p].en=tr[p].r-tr[p].l+1;
tr[p].fr=tr[p].r-tr[p].l+1;
tr[p].sumz=0;
tr[p].cntz=0;
tr[p].enz=0;
tr[p].frz=0;
}
else if(tr[p].num==-1){
node z=tr[p];
tr[p].sum=z.sumz;
tr[p].cnt=z.cntz;
tr[p].fr=z.frz;
tr[p].en=z.enz;
tr[p].sumz=z.sum;
tr[p].cntz=z.cnt;
tr[p].frz=z.fr;
tr[p].enz=z.en;
tr[p].l=z.l;
tr[p].r=z.r;
tr[p].num=z.num;
}
return;
}
pd(p);
ll mid=tr[p].l+tr[p].r>>1;
if(x<=mid){
xo(p<<1,x,y);
}
if(y>mid){
xo((p<<1)+1,x,y);
}
tr[p]=tr[p<<1]+tr[(p<<1)+1];
}
ll askcnt(ll p,ll x,ll y){
if(tr[p].l>=x&&tr[p].r<=y){
return tr[p].cnt;
}
pd(p);
ll mid=tr[p].l+tr[p].r>>1;
ll ans=0;
if(x<=mid){
ans=askcnt(p<<1,x,y);
}
if(y>mid){
ans=max(ans,askcnt((p<<1)+1,x,y));
}
if(tr[p<<1].r-tr[p<<1].en+1<x){
if(tr[(p<<1)+1].l+tr[(p<<1)+1].fr-1>y){
ans=max(ans,y-tr[(p<<1)+1].l+1+tr[p<<1].r-x+1);
}
else{
ans=max(ans,tr[(p<<1)+1].fr+tr[p<<1].r-x+1);
}
}
else{
if(tr[(p<<1)+1].l+tr[(p<<1)+1].fr-1>y){
ans=max(ans,y-tr[(p<<1)+1].l+1+tr[p<<1].en);
}
else{
ans=max({ans,tr[p<<1].en+tr[(p<<1)+1].fr});
}
}
return ans;
}
ll asksum(ll p,ll x,ll y){
if(tr[p].l>=x&&tr[p].r<=y){
return tr[p].sum;
}
pd(p);
ll mid=tr[p].l+tr[p].r>>1;
ll ans=0;
if(x<=mid){
ans=asksum(p<<1,x,y);
}
if(y>mid){
ans+=asksum((p<<1)+1,x,y);
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
ll op,l,r;
cin>>op>>l>>r;
if(op==0||op==1){
change(1,l+1,r+1,op);
}
if(op==2){
xo(1,l+1,r+1);
}
if(op==3){
cout<<asksum(1,l+1,r+1)<<"\n";
}
if(op==4){
cout<<askcnt(1,l+1,r+1)<<"\n";
}
}
return 0;
}