过了hack
#include<bits/stdc++.h>
#define elif else if
using namespace std;
typedef long long ll;
ll read() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;}
const ll N=1e5+10;
ll n,_,a[N];
ll op,l,r;
struct Node{
ll len;
ll sum1,lsum1,rsum1,ans1;
ll sum0,lsum0,rsum0,ans0;
friend Node operator+(Node x,Node y) {
Node ans={0,0,0,0,0,0,0,0,0};
ans.len=x.len+y.len;
ans.sum0=x.sum0+y.sum0;
ans.sum1=x.sum1+y.sum1;
if(x.sum1==x.len) ans.lsum1=x.len+y.lsum1;
else ans.lsum1=x.lsum1;
if(y.sum1==y.len) ans.rsum1=x.rsum1+y.len;
else ans.rsum1=y.rsum1;
ans.ans1=max(x.ans1,y.ans1);
ans.ans1=max(ans.ans1,x.rsum1+y.lsum1);
if(x.sum0==x.len) ans.lsum0=x.len+y.lsum0;
else ans.lsum0=x.lsum0;
if(y.sum0==y.len) ans.rsum0=x.rsum0+y.len;
else ans.rsum0=y.rsum0;
ans.ans0=max(x.ans0,y.ans0);
ans.ans0=max(ans.ans0,x.rsum0+y.lsum0);
return ans;
}
void fz(Node &x,ll op,ll y){
x.len=y;
if(op==1){
x.sum0=x.lsum0=x.rsum0=x.ans0=y;
x.sum1=x.lsum1=x.rsum1=x.ans1=0;
} elif (op==2){
x.sum0=x.lsum0=x.rsum0=x.ans0=0;
x.sum1=x.lsum1=x.rsum1=x.ans1=y;
}
}
};
struct Tree {
ll l,r;
Node message;
ll lazy;
} t[4*N];
void build(ll q,ll l,ll r) {
t[q].l=l;
t[q].r=r;
if(l==r) {
if(a[l]==1) t[q].message.fz(t[q].message,2,r-l+1);
else t[q].message.fz(t[q].message,1,r-l+1);
return ;
}
ll mid=(t[q].l+t[q].r)/2;
build(q*2,l,mid);
build(q*2+1,mid+1,r);
t[q].message=t[q*2].message+t[q*2+1].message;
}
void spread(ll q) {
if(t[q].lazy==0) return ;
if(t[q].lazy==1) {
t[q*2].message.fz(t[q*2].message,1,t[q*2].message.len);
t[q*2+1].message.fz(t[q*2+1].message,1,t[q*2+1].message.len);
}
elif (t[q].lazy==2) {
t[q*2].message.fz(t[q*2].message,2,t[q*2].message.len);
t[q*2+1].message.fz(t[q*2+1].message,2,t[q*2+1].message.len);
}
elif (t[q].lazy==3) {
swap(t[q*2].message.ans0,t[q*2].message.ans1);
swap(t[q*2].message.lsum0,t[q*2].message.lsum1);
swap(t[q*2].message.rsum0,t[q*2].message.rsum1);
swap(t[q*2].message.sum0,t[q*2].message.sum1);
swap(t[q*2+1].message.ans0,t[q*2+1].message.ans1);
swap(t[q*2+1].message.lsum0,t[q*2+1].message.lsum1);
swap(t[q*2+1].message.rsum0,t[q*2+1].message.rsum1);
swap(t[q*2+1].message.sum0,t[q*2+1].message.sum1);
}
t[q*2].lazy=t[q*2+1].lazy=t[q].lazy;
t[q].lazy=0;
}
ll ask_sum(ll q,ll l,ll r) {
if(t[q].l>=l&&t[q].r<=r) {
return t[q].message.sum1;
}
spread(q);
ll ans=0,mid=(t[q].l+t[q].r)/2;
if(l<=mid) ans+=ask_sum(q*2,l,r);
if(r>mid) ans+=ask_sum(q*2+1,l,r);
return ans;
}
Node ask_ans(ll q,ll l,ll r) {
if(t[q].l>=l&&t[q].r<=r) {
return t[q].message;
}
spread(q);
Node ans={0,0,0,0,0,0,0,0,0},ans1={0,0,0,0,0,0,0,0,0},ans2={0,0,0,0,0,0,0,0,0};
ll mid=(t[q].l+t[q].r)/2;
if(l<=mid) ans1=ask_ans(q*2,l,r);
if(r>mid) ans2=ask_ans(q*2+1,l,r);
ans=ans1+ans2;
return ans;
}
void change(ll q,ll l,ll r,ll lazy){
spread(q);
if(t[q].l>=l&&t[q].r<=r){
if(lazy==1){
t[q].message.fz(t[q].message,1,t[q].message.len);
} elif (lazy==2) {
t[q].message.fz(t[q].message,2,t[q].message.len);
} elif (lazy==3){
swap(t[q].message.ans0,t[q].message.ans1);
swap(t[q].message.lsum0,t[q].message.lsum1);
swap(t[q].message.rsum0,t[q].message.rsum1);
swap(t[q].message.sum0,t[q].message.sum1);
}
t[q].lazy=lazy;
return ;
}
ll mid=(t[q].l+t[q].r)/2;
if(l<=mid) change(q*2,l,r,lazy);
if(r>mid) change(q*2+1,l,r,lazy);
t[q].message=t[q*2].message+t[q*2+1].message;
}
signed main() {
n=read();
_=read();
for (int i=1;i<=n;i++){
a[i]=read();
}
build(1,1,n);
while(_--) {
op=read();
l=read();
r=read();
l++;
r++;
if(op==0) {
change(1,l,r,1);
}
elif (op==1) {
change(1,l,r,2);
}
elif (op==2) {
change(1,l,r,3);
}
elif (op==3) {
printf("%lld\n",ask_sum(1,l,r));
}
elif(op==4) {
printf("%lld\n",ask_ans(1,l,r).ans1);
}
}
}