BLty777 @ 2024-12-20 19:41:53
#include<bits/stdc++.h>
#define int long long
#define l(p) p<<1
#define r(p) p<<1|1
using namespace std;
const int N=1e5+5;
int n,m,a[N],id,x,y;
struct stu{
int l,r,b,lb,rb,mb,c,lc,rc,mc,len,tag,rev;
}tr[4*N];
void pushup(stu &p,stu l,stu r){
p.b=l.b+r.b;
p.lb=l.c?l.lb:l.b+r.lb;
p.rb=r.c?r.rb:r.b+l.rb;
p.mb=max(max(l.mb,r.mb),l.rb+r.lb);
p.c=l.c+r.c;
p.lc=l.b?l.lc:l.c+r.lc;
p.rc=r.b?r.rc:r.c+l.rc;
p.mc=max(max(l.mc,r.mc),l.rc+r.lc);
}
void build(int p,int l,int r){
tr[p]={l,r,a[l],a[l],a[l],a[l],a[l]^1,a[l]^1,a[l]^1,a[l]^1,r-l+1,-1,0};
if(l==r) return ;
int mid=(l+r)>>1;
build(l(p),l,mid);
build(r(p),mid+1,r);
pushup(tr[p],tr[l(p)],tr[r(p)]);
}
void pd(int p,int k){
if(k==0){
tr[p].b=tr[p].lb=tr[p].rb=tr[p].mb=0;
tr[p].c=tr[p].lc=tr[p].rc=tr[p].mc=tr[p].len;
tr[p].tag=-1;
tr[p].rev=0;
}
if(k==1){
tr[p].b=tr[p].lb=tr[p].rb=tr[p].mb=tr[p].len;
tr[p].c=tr[p].lc=tr[p].rc=tr[p].mc=0;
tr[p].tag=-1;
tr[p].rev=0;
}
if(k==2){
swap(tr[p].b,tr[p].c);
swap(tr[p].lb,tr[p].lc);
swap(tr[p].rb,tr[p].rc);
swap(tr[p].mb,tr[p].mc);
tr[p].rev^=1;
}
}
void pushdown(int p){
if(!tr[p].tag) pd(l(p),0),pd(r(p),0);
if(tr[p].tag==1) pd(l(p),1),pd(r(p),1);
if(tr[p].rev) pd(l(p),2),pd(r(p),2);
tr[p].tag=-1;
tr[p].rev=0;
}
stu query(int p,int x,int y){
if(tr[p].r>y||tr[p].l<x) return {};
if(tr[p].l>=x&&tr[p].r<=y) return tr[p];
pushdown(p);
stu t;
pushup(t,query(l(p),x,y),query(r(p),x,y));
return t;
}
void change(int p,int x,int y,int k){
if(tr[p].l>y||tr[p].r<x) return ;
if(tr[p].l>=x&&tr[p].l<=y){
pd(p,k);
return ;
}
pushdown(p);
int mid=(tr[p].l+tr[p].r)>>1;
if(x<=mid) change(l(p),x,y,k);
else change(r(p),x,y,k);
pushup(tr[p],tr[l(p)],tr[r(p)]);
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%lld",&id,&x,&y);
x++,y++;
if(id<3){
change(1,x,y,id);
}else{
stu t=query(1,x,y);
printf("%lld\n",id==3?t.b:t.mb);
}
}
return 0;
}