#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
const int M=1e4;
int L[M],R[M],pos[N],a[N],ans[M],n,m,t,L_1[M],L_0[M],R_1[M],R_0[M],MAX_1[M],MAX_0[M];
bool tag[M];
void solve1(int p){
int cnt_1=0,cnt_0=0;
MAX_1[p]=MAX_0[p]=0;
for(int i=L[p];i<=R[p];i++){
if((a[i]^tag[p])==1){
cnt_1++;
cnt_0=0;
MAX_1[p]=max(MAX_1[p],cnt_1);
}
if((a[i]^tag[p])==0){
cnt_0++;
cnt_1=0;
MAX_0[p]=max(MAX_0[p],cnt_0);
}
}
}
void solve2(int p){
int cnt=0;
for(int i=L[p];i<=R[p];i++){
if((a[i]^tag[p])==1) cnt++;
else break;
}
L_1[p]=cnt;cnt=0;
for(int i=L[p];i<=R[p];i++){
if((a[i]^tag[p])==0) cnt++;
else break;
}
L_0[p]=cnt;cnt=0;
for(int i=R[p];i>=L[p];i--){
if((a[i]^tag[p])==1) cnt++;
else break;
}
R_1[p]=cnt;cnt=0;
for(int i=R[p];i>=L[p];i--){
if((a[i]^tag[p])==0) cnt++;
else break;
}
R_0[p]=cnt;cnt=0;
}
void cg0(int l,int r){
int p=pos[l],q=pos[r];
if(p==q){
for(int i=l;i<=r;i++){
if(a[i]^tag[q]) ans[q]-=1;
if(!tag[q]) a[i]=0;
if(tag[q]) a[i]=1;
}
solve1(p),solve2(p);
}
else{
for(int i=p+1;i<=q-1;i++){
ans[i]=0;
L_0[i]=R_0[i]=MAX_0[i]=R[i]-L[i]+1;
L_1[i]=R_1[i]=MAX_1[i]=0;
tag[i]=0;
for(int j=L[i];j<=R[i];j++) a[j]=0;
}
for(int i=l;i<=R[p];i++){
if(a[i]^tag[p]) ans[p]-=1;
if(!tag[p]) a[i]=0;
if(tag[p]) a[i]=1;
}
solve1(p),solve2(p);
for(int i=L[q];i<=r;i++){
if(a[i]^tag[q]) ans[q]-=1;
if(!tag[q]) a[i]=0;
if(tag[q]) a[i]=1;
}
solve1(q),solve2(q);
}
}
void cg1(int l,int r){
int p=pos[l],q=pos[r];
if(p==q){
for(int i=l;i<=r;i++){
if(!(a[i]^tag[q])) ans[q]+=1;
if(!tag[q]) a[i]=1;
if(tag[q]) a[i]=0;
}
solve1(p),solve2(p);
}
else{
for(int i=p+1;i<=q-1;i++){
ans[i]=R[i]-L[i]+1;
L_1[i]=R_1[i]=MAX_1[i]=R[i]-L[i]+1;
L_0[i]=R_0[i]=MAX_0[i]=0;
tag[i]=0;
for(int j=L[i];j<=R[i];j++) a[j]=1;
}
for(int i=l;i<=R[p];i++){
if(!(a[i]^tag[p])) ans[p]+=1;
if(!tag[p]) a[i]=1;
if(tag[p]) a[i]=0;
}
solve1(p),solve2(p);
for(int i=L[q];i<=r;i++){
if(!(a[i]^tag[q])) ans[q]+=1;
if(!tag[q]) a[i]=1;
if(tag[q]) a[i]=0;
}
solve1(q),solve2(q);
}
}
void cg2(int l,int r){
int p=pos[l],q=pos[r];
if(p==q){
for(int i=l;i<=r;i++){
int nw=a[i]^tag[q];
ans[q]-=nw;
a[i]^=1;
nw=a[i]^tag[q];
ans[q]+=(nw);
}
solve1(p),solve2(p);
}
else{
for(int i=p+1;i<=q-1;i++){
tag[i]^=1;
ans[i]=(R[i]-L[i]+1)-ans[i];
swap(L_1[i],L_0[i]);
swap(R_1[i],R_0[i]);
swap(MAX_1[i],MAX_0[i]);
}
for(int i=l;i<=R[p];i++){
int nw=a[i]^tag[p];
ans[p]-=(nw);
a[i]^=1;
nw=a[i]^tag[p];
ans[p]+=(nw);
}
solve1(p),solve2(p);
for(int i=L[q];i<=r;i++){
int nw=a[i]^tag[q];
ans[q]-=(nw);
a[i]^=1;
nw=a[i]^tag[q];
ans[q]+=(nw);
}
solve1(q),solve2(q);
}
}
int ask3(int l,int r){
int p=pos[l],q=pos[r];
if(p==q){
int res=0;
for(int i=l;i<=r;i++){
int nw=a[i]^tag[p];
res+=(nw);
}
return res;
}
else{
int res=0;
for(int i=p+1;i<=q-1;i++)res+=ans[i];
for(int i=l;i<=R[p];i++) {
int nw=a[i]^tag[p];
res+=(nw);
}
for(int i=L[q];i<=r;i++) {
int nw=a[i]^tag[q];
res+=(nw);
}
return res;
}
}
int ask4(int l,int r){
int p=pos[l],q=pos[r];
if(p==q){
int cnt=0,anss=0;
for(int i=l;i<=r;i++){
if((a[i]^tag[p])==1){
cnt++;
anss=max(anss,cnt);
}
else cnt=0;
}
return anss;
}
else{
int max1=0,max2=0,max3=0;
int cnt=0;
for(int i=l;i<=R[p];i++){
if((a[i]^tag[p])==1){
cnt++;
max1=max(max1,cnt);
}
else cnt=0;
}
cnt=0;
for(int i=p+1;i<=q-1;i++) max2=max(max2,MAX_1[i]);
cnt=0;
for(int i=L[q];i<=r;i++){
if((a[i]^tag[q])==1){
cnt++;
max3=max(max3,cnt);
}
else cnt=0;
}
int max4=0;
cnt=0;
int pp=0,qq=0;
for(int i=R[p];i>=l;i--){
if((a[i]^tag[p])==1) pp++;
else break;
}
for(int i=L[q];i<=r;i++){
if((a[i]^tag[q])==1) qq++;
else break;
}
cnt=0;
for(int i=p;i<=q;i++){
max4=max(max4,cnt);
if(i==p){
cnt+=pp;
max4=max(max4,cnt);
continue;
}
if(i==q){
cnt+=qq;
max4=max(max4,cnt);
continue;
}
if(L_1[i]==R[i]-L[i]+1){
cnt+=L_1[i];
max4=max(max4,cnt);
continue;
}
else{
max4=max(max4,cnt);
if(L_1[i-1]>=R[i-1]-L[i-1]+1 && L_1[i]==R_1[i]){
cnt+=L_1[i];
max4=max(max4,cnt);
cnt=0;
continue;
}
else{
cnt=0;
if(i-1>=p+1) cnt+=R_1[i-1];
max4=max(max4,cnt);
cnt+=L_1[i];
max4=max(max4,cnt);
}
}
}
max4=max(max4,cnt);
return max(max1,max(max2,max(max3,max4)));
}
}
signed main(){
memset(a,0,sizeof(a));
memset(ans,0,sizeof(ans));
memset(tag,0,sizeof(tag));
memset(L_1,0,sizeof(L_1));
memset(L_0,0,sizeof(L_0));
memset(R_1,0,sizeof(R_1));
memset(R_0,0,sizeof(R_0));
memset(MAX_0,0,sizeof(MAX_0));
memset(MAX_1,0,sizeof(MAX_1));
cin>>n>>m;
int t=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=t;i++){
L[i]=(i-1) *sqrt(n)+1;
R[i]=sqrt(n)*i;
}
if(R[t]<n){
t++;
L[t]=R[t-1]+1;
R[t]=n;
}
for(int i=1;i<=t;i++){
for(int j=L[i];j<=R[i];j++){
pos[j]=i;
if(a[j]==1) ans[i]++;
}
solve1(i),solve2(i);
}
for(int i=1;i<=t;i++) solve1(i),solve2(i);
for(int i=1;i<=m;i++){
int op;
cin>>op;
int l,r;
cin>>l>>r;
l++,r++;
if(op==0) cg0(l,r);
if(op==1) cg1(l,r);
if(op==2) cg2(l,r);
if(op==3) cout<<ask3(l,r)<<endl;
if(op==4) cout<<ask4(l,r)<<endl;
}
}