#include<bits/stdc++.h>
using namespace std;
struct kuai {
long long zhi=0;
long long l=0;
long long r=0;
long long llian1=0;
long long rlian1=0;
long long lian1=0;
long long llian0=0;
long long rlian0=0;
long long lian0=0;
};
long long meikuai;
kuai block[1000005];
long long c[1000005];
long long lan[1000005];
vector<long long> lan0(1000005,2);
inline long long getkuai(long long x) {
return (x-1)/meikuai+1;
}
inline void push(long long x) {
for(long long n=block[x].l; n<=block[x].r; n++) {
if(lan0[x]==2) c[n]=(c[n]^lan[x]);
else if(lan0[x]==0) c[n]=(c[n]&lan0[x]);
else if(lan0[x]==1) c[n]=(c[n]|lan0[x]);
}
lan0[x]=2;
lan[x]=0;
}
inline void weihu(long long x) {
push(x);
long long cnt=0;
for(long long i=block[x].l; i<=block[x].r; i++) {
if(c[i]==1) {
block[x].lian0=max(block[x].lian0,cnt);
cnt=0;
} else cnt++;
}
block[x].lian0=max(block[x].lian0,cnt);
cnt=0;
for(long long i=block[x].l; i<=block[x].r; i++) {
if(c[i]==0) {
block[x].lian1=max(block[x].lian1,cnt);
cnt=0;
} else cnt++;
}
block[x].lian1=max(block[x].lian1,cnt);
cnt=0;
long long f0=0,f1=0,cnt1=0;
for(long long i=block[x].l; i<=block[x].r; i++) {
if(c[i]==0) {
if(f0==0) cnt++;
block[x].llian1=max(block[x].llian1,cnt1);
cnt1=0;
f1=1;
}
if(c[i]==1) {
if(f1==0) cnt1++;
block[x].llian0=max(block[x].llian0,cnt);
cnt=0;
f0=1;
}
if(f0==1&&f1==1) break;
}
block[x].llian1=max(block[x].llian1,cnt1);
block[x].llian0=max(block[x].llian0,cnt);
f0=0,f1=0,cnt1=0,cnt=0;
for(long long i=block[x].r; i>=block[x].l; i--) {
if(c[i]==0) {
if(f0==0) cnt++;
block[x].rlian1=max(block[x].rlian1,cnt1);
cnt1=0;
f1=1;
}
if(c[i]==1) {
if(f1==0) cnt1++;
block[x].rlian0=max(cnt,block[x].rlian0);
cnt=0;
f0=1;
}
if(f0==1&&f1==1) break;
}
block[x].rlian1=max(block[x].rlian1,cnt1);
block[x].rlian0=max(cnt,block[x].rlian0);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
long long a,b;
cin>>a>>b;
for(long long i=1; i<=a; i++) {
cin>>c[i];
}
meikuai=(long long)sqrt(a);
long long sum=0,cnt=1;
for(long long i=1; i<=a; i++) {
sum+=c[i];
if(i%meikuai==0) {
block[cnt].zhi=sum;
block[cnt].l=block[cnt-1].r+1;
block[cnt].r=i;
sum=0;
weihu(cnt);
cnt++;
}
}
if(a%((long long)sqrt(a))!=0) {
block[cnt].zhi=sum;
block[cnt].l=block[cnt-1].r+1;
block[cnt].r=a;
}
weihu(cnt);
long long ji;
long long quel,quer,lid,rid;
for(long long i=0; i<b; i++) {
cin>>ji;
cin>>quel>>quer;
quel++;
quer++;
lid=getkuai(quel);
rid=getkuai(quer);
if(ji==0) {
if(lid==rid) {
for(long long n=quel; n<=quer; n++) {
if(c[n]==1) {
block[lid].zhi--;
c[n]=0;
}
}
weihu(lid);
} else {
for(long long n=quel; n<=block[lid].r; n++) {
if(c[n]==1) {
block[lid].zhi--;
c[n]=0;
}
}
weihu(lid);
for(long long n=lid+1; n<rid; n++) {
block[n].zhi=0;
block[n].lian0=block[n].r-block[n].l+1;
block[n].llian0=block[n].lian0;
block[n].rlian0=block[n].lian0;
block[n].lian1=0;
block[n].llian1=0;
block[n].rlian1=0;
lan0[n]=0;
lan[n]=0;
}
for(long long n=block[rid].l; n<=quer; n++) {
if(c[n]==1) {
block[rid].zhi--;
c[n]=0;
}
}
weihu(rid);
}
}
if(ji==1) {
if(lid==rid) {
for(long long n=quel; n<=quer; n++) {
if(c[n]==0) {
block[lid].zhi++;
c[n]=1;
}
}
weihu(lid);
} else {
for(long long n=quel; n<=block[lid].r; n++) {
if(c[n]==0) {
block[lid].zhi++;
c[n]=1;
}
}
weihu(lid);
for(long long n=lid+1; n<rid; n++) {
lan0[n]=1;
block[n].zhi=block[n].r-block[n].l+1;
lan[n]=0;
block[n].lian1=block[n].r-block[n].l+1;
block[n].llian1=block[n].lian1;
block[n].rlian1=block[n].lian1;
block[n].lian0=0;
block[n].llian0=0;
block[n].rlian0=0;
}
for(long long n=block[rid].l; n<=quer; n++) {
if(c[n]==0) {
block[rid].zhi++;
c[n]=1;
}
}
weihu(rid);
}
}
if(ji==2) {
if(lid==rid) {
for(long long n=quel; n<=quer; n++) {
if(c[n]==0) {
block[lid].zhi++;
c[n]=1;
} else if(c[n]==1) {
block[lid].zhi--;
c[n]=0;
}
}
weihu(lid);
} else {
for(long long n=quel; n<=block[lid].r; n++) {
if(c[n]==0) {
block[lid].zhi++;
c[n]=1;
} else if(c[n]==1) {
block[lid].zhi--;
c[n]=0;
}
}
weihu(lid);
for(long long n=lid+1; n<rid; n++) {
if(lan0[n]==2) lan[n]=lan[n]^1;
else lan0[n]=lan0[n]^1;
swap(block[n].lian0,block[n].lian1);
swap(block[n].llian0,block[n].llian1);
swap(block[n].rlian0,block[n].rlian1);
}
for(long long n=block[rid].l; n<=quer; n++) {
if(c[n]==0) {
block[rid].zhi++;
c[n]=1;
} else if(c[n]==1) {
block[rid].zhi--;
c[n]=0;
}
}
weihu(rid);
}
}
if(ji==3) {
sum=0;
if(lid==rid) {
for(long long n=quel; n<=quer; n++) {
if(lan0[lid]==2) sum+=(c[n]^lan[lid]);
else if(lan0[lid]==0) sum+=(c[n]&lan0[lid]);
else if(lan0[lid]==1) sum+=(c[n]|lan0[lid]);
}
} else {
for(long long n=quel; n<=block[lid].r; n++) {
if(lan0[lid]==2) sum+=(c[n]^lan[lid]);
else if(lan0[lid]==0) sum+=(c[n]&lan0[lid]);
else if(lan0[lid]==1) sum+=1;
}
for(long long n=lid+1; n<rid; n++) {
if(lan0[n]==2) {
if(lan[n]==1) sum+=block[n].r-block[n].l+1-block[n].zhi;
else sum+=block[n].zhi;
} else {
if(lan0[n]==1) sum+=block[n].r-block[n].l+1;
}
}
for(long long n=block[rid].l; n<=quer; n++) {
if(lan0[rid]==2) sum+=(c[n]^lan[rid]);
else if(lan0[rid]==0) sum+=(c[n]&lan0[rid]);
else if(lan0[rid]==1) sum+=1;
}
}
cout<<sum<<endl;
}
if(ji==4) {
weihu(lid);
sum=0;
cnt=0;
if(lid==rid) {
for(long long n=quel; n<=quer; n++) {
if(c[n]==0) {
sum=max(sum,cnt);
cnt=0;
} else cnt++;
}
sum=max(sum,cnt);
} else {
weihu(rid);
sum=max(min(block[lid].rlian1,block[lid].r-quel+1)+min(block[lid+1].llian1,quer-block[lid+1].l+1),sum);
for(long long n=lid+1; n<rid-1; n++) {
sum=max(block[n].rlian1+block[n+1].llian1,max(block[n].lian1,sum));
}
sum=max(block[rid-1].rlian1+min(quer-block[rid].l+1,block[rid].llian1),sum);
sum=max(sum,block[rid-1].lian1);
}
cout<<sum<<endl;
}
}
return 0;
}