已经调了几天了还是调不对T_T
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int MOD=998244353;
#define vs void slove()
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define ft for(cin>>t;t--;slove())
#define endl "\n"
typedef long long ll;
ll n,m;
ll a[100005];
struct node{
ll datayi,lenl,lenr,num,sum,set=-1,Lenl,Lenr,datali;
ll l,r;
bool ci=0;
}t[400005];
void build(ll fa,ll l,ll r){
if(l==r){
if(a[l]==0){
t[fa].datayi=t[fa].lenl=t[fa].lenr=t[fa].sum=t[fa].l=t[fa].r=0;
t[fa].Lenl=t[fa].Lenr=t[fa].datali=1;
}else{
t[fa].datayi=t[fa].lenl=t[fa].lenr=t[fa].sum=t[fa].l=t[fa].r=1;
t[fa].Lenl=t[fa].Lenr=t[fa].datali=0;
}
t[fa].num=1;
return;
}
ll mid=(l+r)/2;
build(fa<<1,l,mid);
build(fa<<1|1,mid+1,r);
t[fa].num=t[fa<<1].num+t[fa<<1|1].num;
t[fa].l=t[fa<<1].l,t[fa].r=t[fa<<1|1].r;
t[fa].sum=t[fa<<1].sum+t[fa<<1|1].sum;
if(t[fa<<1].r==1&&t[fa<<1|1].l==1){
t[fa].datayi=max({t[fa<<1].datayi,t[fa<<1|1].datayi,t[fa<<1].lenr+t[fa<<1|1].lenl});
if(t[fa<<1].datayi==t[fa<<1].num)t[fa].lenl=t[fa<<1].lenl+t[fa<<1|1].lenl;
else t[fa].lenl=t[fa<<1].lenl;
if(t[fa<<1|1].datayi==t[fa<<1|1].num)t[fa].lenr=t[fa<<1|1].lenr+t[fa<<1].lenr;
else t[fa].lenr=t[fa<<1|1].lenr;
}else{
t[fa].datayi=max(t[fa<<1].datayi,t[fa<<1|1].datayi);
t[fa].lenl=t[fa<<1].lenl;
t[fa].lenr=t[fa<<1|1].lenr;
}
if(t[fa<<1].r==0&&t[fa<<1|1].l==0){
t[fa].datali=max({t[fa<<1].datali,t[fa<<1|1].datali,t[fa<<1].Lenr+t[fa<<1|1].Lenl});
if(t[fa<<1].sum==0)t[fa].Lenl=t[fa<<1].Lenl+t[fa<<1|1].Lenl;
else t[fa].Lenl=t[fa<<1].Lenl;
if(t[fa<<1|1].sum==0)t[fa].Lenr=t[fa<<1|1].Lenr+t[fa<<1].Lenr;
else t[fa].Lenr=t[fa<<1|1].Lenr;
}else{
t[fa].datali=max(t[fa<<1].datali,t[fa<<1|1].datali);
t[fa].Lenl=t[fa<<1].Lenl;
t[fa].Lenr=t[fa<<1|1].Lenr;
}
}
void push_down(ll fa){
if(t[fa].set!=-1){
if(t[fa].set==1){
t[fa<<1].datayi=t[fa<<1].sum=t[fa<<1].lenl=t[fa<<1].lenr=t[fa<<1].num;
t[fa<<1|1].datayi=t[fa<<1|1].sum=t[fa<<1|1].lenl=t[fa<<1|1].lenr=t[fa<<1|1].num;
t[fa<<1].Lenl=t[fa<<1|1].Lenl=t[fa<<1].Lenr=t[fa<<1|1].Lenr=t[fa].datali=0;
}else{
t[fa<<1].datayi=t[fa<<1].sum=t[fa<<1].lenl=t[fa<<1].lenr=0;
t[fa<<1|1].datayi=t[fa<<1|1].sum=t[fa<<1|1].lenl=t[fa<<1|1].lenr=0;
t[fa<<1].Lenl=t[fa<<1].Lenr=t[fa<<1].num;
t[fa<<1|1].Lenl=t[fa<<1|1].Lenr=t[fa].datali=t[fa<<1|1].num;
}
t[fa<<1].l=t[fa<<1].r=t[fa<<1|1].l=t[fa<<1|1].r=t[fa<<1].set=t[fa<<1|1].set=t[fa].set;
t[fa].set=-1;
t[fa<<1].ci=t[fa<<1|1].ci=0;
}
if(t[fa].ci){
t[fa<<1].sum=t[fa<<1].num-t[fa<<1].sum;
t[fa<<1].l^=1,t[fa<<1].r^=1;
swap(t[fa<<1].datali,t[fa<<1].datayi),swap(t[fa<<1].Lenl,t[fa<<1].lenl),swap(t[fa<<1].Lenr,t[fa<<1].lenr);
t[fa<<1|1].sum=t[fa<<1|1].num-t[fa<<1|1].sum;
t[fa<<1|1].l^=1,t[fa<<1|1].r^=1;
swap(t[fa<<1|1].datali,t[fa<<1|1].datayi),swap(t[fa<<1|1].Lenl,t[fa<<1|1].lenl),swap(t[fa<<1|1].Lenr,t[fa<<1|1].lenr);
t[fa<<1].ci=!t[fa<<1].ci,t[fa<<1|1].ci=!t[fa<<1|1].ci;
t[fa].ci=0;
}
}
void update1(ll fa,ll l,ll r,ll ql,ll qr,ll k){
if(l<=ql&&r>=qr){
if(k==0){
t[fa].datayi=t[fa].l=t[fa].r=t[fa].lenl=t[fa].lenr=t[fa].sum=0;
t[fa].Lenl=t[fa].Lenr=t[fa].datali=t[fa].num;
}else{
t[fa].datayi=t[fa].lenl=t[fa].lenr=t[fa].sum=t[fa].num;
t[fa].l=t[fa].r=1;
t[fa].Lenl=t[fa].Lenr=t[fa].datali=0;
}
t[fa].set=k;
t[fa].ci=0;
return;
}
ll mid=(ql+qr)/2;
push_down(fa);
if(l<=mid)update1(fa<<1,l,r,ql,mid,k);
if(r>mid)update1(fa<<1|1,l,r,mid+1,qr,k);
t[fa].sum=t[fa<<1].sum+t[fa<<1|1].sum;
t[fa].l=t[fa<<1].l,t[fa].r=t[fa<<1|1].r;
if(t[fa<<1].r==1&&t[fa<<1|1].l==1){
t[fa].datayi=max({t[fa<<1].datayi,t[fa<<1|1].datayi,t[fa<<1].lenr+t[fa<<1|1].lenl});
if(t[fa<<1].datayi==t[fa<<1].num)t[fa].lenl=t[fa<<1].lenl+t[fa<<1|1].lenl;
else t[fa].lenl=t[fa<<1].lenl;
if(t[fa<<1|1].datayi==t[fa<<1|1].num)t[fa].lenr=t[fa<<1|1].lenr+t[fa<<1].lenr;
else t[fa].lenr=t[fa<<1|1].lenr;
}else{
t[fa].datayi=max(t[fa<<1].datayi,t[fa<<1|1].datayi);
t[fa].lenl=t[fa<<1].lenl;
t[fa].lenr=t[fa<<1|1].lenr;
}
if(t[fa<<1].r==0&&t[fa<<1|1].l==0){
t[fa].datali=max({t[fa<<1].datali,t[fa<<1|1].datali,t[fa<<1].Lenr+t[fa<<1|1].Lenl});
if(t[fa<<1].sum==0)t[fa].Lenl=t[fa<<1].Lenl+t[fa<<1|1].Lenl;
else t[fa].Lenl=t[fa<<1].Lenl;
if(t[fa<<1|1].sum==0)t[fa].Lenr=t[fa<<1|1].Lenr+t[fa<<1].Lenr;
else t[fa].Lenr=t[fa<<1|1].Lenr;
}else{
t[fa].datali=max(t[fa<<1].datali,t[fa<<1|1].datali);
t[fa].Lenl=t[fa<<1].Lenl;
t[fa].Lenr=t[fa<<1|1].Lenr;
}
}
void update2(ll fa,ll l,ll r,ll ql,ll qr){
if(l<=ql&&r>=qr){
t[fa].sum=t[fa].num-t[fa].sum;
t[fa].l^=1,t[fa].r^=1;
swap(t[fa].datali,t[fa].datayi),swap(t[fa].Lenl,t[fa].lenl),swap(t[fa].Lenr,t[fa].lenr);
t[fa].ci=!t[fa].ci;
return;
}
ll mid=(ql+qr)/2;
push_down(fa);
if(l<=mid)update2(fa<<1,l,r,ql,mid);
if(r>mid)update2(fa<<1|1,l,r,mid+1,qr);
t[fa].sum=t[fa<<1].sum+t[fa<<1|1].sum;
t[fa].l=t[fa<<1].l,t[fa].r=t[fa<<1|1].r;
if(t[fa<<1].r==1&&t[fa<<1|1].l==1){
t[fa].datayi=max({t[fa<<1].datayi,t[fa<<1|1].datayi,t[fa<<1].lenr+t[fa<<1|1].lenl});
if(t[fa<<1].datayi==t[fa<<1].num)t[fa].lenl=t[fa<<1].lenl+t[fa<<1|1].lenl;
else t[fa].lenl=t[fa<<1].lenl;
if(t[fa<<1|1].datayi==t[fa<<1|1].num)t[fa].lenr=t[fa<<1|1].lenr+t[fa<<1].lenr;
else t[fa].lenr=t[fa<<1|1].lenr;
}else{
t[fa].datayi=max(t[fa<<1].datayi,t[fa<<1|1].datayi);
t[fa].lenl=t[fa<<1].lenl;
t[fa].lenr=t[fa<<1|1].lenr;
}
if(t[fa<<1].r==0&&t[fa<<1|1].l==0){
t[fa].datali=max({t[fa<<1].datali,t[fa<<1|1].datali,t[fa<<1].Lenr+t[fa<<1|1].Lenl});
if(t[fa<<1].sum==0)t[fa].Lenl=t[fa<<1].Lenl+t[fa<<1|1].Lenl;
else t[fa].Lenl=t[fa<<1].Lenl;
if(t[fa<<1|1].sum==0)t[fa].Lenr=t[fa<<1|1].Lenr+t[fa<<1].Lenr;
else t[fa].Lenr=t[fa<<1|1].Lenr;
}else{
t[fa].datali=max(t[fa<<1].datali,t[fa<<1|1].datali);
t[fa].Lenl=t[fa<<1].Lenl;
t[fa].Lenr=t[fa<<1|1].Lenr;
}
}
ll query1(ll fa,ll l,ll r,ll ql,ll qr){
if(l<=ql&&r>=qr){
return t[fa].sum;
}
ll mid=(ql+qr)/2,ans=0;
push_down(fa);
if(l<=mid)ans+=query1(fa<<1,l,r,ql,mid);
if(r>mid)ans+=query1(fa<<1|1,l,r,mid+1,qr);
return ans;
}
node query2(ll fa,ll l,ll r,ll ql,ll qr){
if(l<=ql&&r>=qr)return t[fa];
push_down(fa);
ll mid=(ql+qr)/2;
node ans,ans1,ans2;
if(l<=mid)ans1=query2(fa<<1,l,r,ql,mid);
if(r>mid)ans2=query2(fa<<1|1,l,r,mid+1,qr);
if(l<=mid&&r>mid){
ans.l=ans1.l,ans.r=ans2.r;
ans.sum=ans1.sum+ans2.sum;
ans.num=ans1.num+ans2.num;
if(ans1.r==1&&ans2.l==1){
ans.datayi=max({ans1.datayi,ans2.datayi,ans1.lenr+ans2.lenl});
if(ans1.datayi==ans1.num)ans.lenl=ans1.lenl+ans2.lenl;
else ans.lenl=ans1.lenl;
if(ans2.datayi==ans2.num)ans.lenr=ans2.lenr+ans1.lenr;
else ans.lenr=ans2.lenr;
}else{
ans.datayi=max(ans1.datayi,ans2.datayi);
ans.lenl=ans1.lenl;
ans.lenr=ans2.lenr;
}
return ans;
}else if(l<=mid)return ans1;
else if(r>mid)return ans2;
}
void check(){
for(int i=1;i<=n;i++)cout<<query1(1,i,i,1,n)<<' ';
cout<<endl;
}
int main(){
IOS;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
ll type,l,r;
// check();
while(m--){
cin>>type>>l>>r;
l++,r++;
// check();
if(type==1){
update1(1,l,r,1,n,1);
}else if(type==2){
update2(1,l,r,1,n);
}else if(type==3){
cout<<query1(1,l,r,1,n)<<endl;
}else if(type==4){
cout<<query2(1,l,r,1,n).datayi<<endl;
}else if(type==0){
update1(1,l,r,1,n,0);
}
}
return 0;
}