LLX7 @ 2024-12-20 19:50:48
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e5+1;
int a[N];
struct tree{
int len,l,r;
int tag,rev;
int mb,lb,lc,mc,rb,rc,b,c;
}tr[N*4];
void pushup(tree &u,tree l,tree r){
u.b=l.b+r.b;
u.lb=l.c?l.lb:l.len+r.lb;
u.rb=r.c?r.rb:r.len+l.rb;
u.mb=max(max(l.mb,r.mb),l.rb+r.lb);
u.c=l.c+r.c;
u.lc=l.b?l.lc:l.len+r.lc;
u.rc=r.c?r.rc:r.len+l.rc;
u.mc=max(max(l.mc,r.mc),l.rc+r.lc);
}
void build(int p,int l,int r){
int t=a[l];
tr[p]={r-l+1,l,r,-1,0,t,t,t,t^1,t^1,t^1,t,t^1};
if(l==r){
return ;
}
int mid=l+r>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
pushup(tr[p],tr[p*2],tr[p*2+1]);
}
void pd(int u,int opt){
tree& t=tr[u];
if(opt==1){
t.b=0,t.lb=0,t.rb=0,t.mb=0;
t.c=t.len,t.lc=t.len,t.rc=t.len,t.mc=t.len;
t.tag=0,t.rev=0;
}
if(opt==2){
t.c=0,t.rc=0,t.lc=0,t.mc=0;
t.b=t.len,t.lb=t.len,t.rb=t.len,t.mb=t.len;
t.tag=1,t.rev=0;
}
if(opt==3){
swap(t.c,t.b);
swap(t.rc,t.rb);
swap(t.lb,t.lc);
swap(t.mc,t.mb);
t.tag=-1,t.rev^=1;
}
}
void pushdown(int u){
tree& t=tr[u];
int ls=u*2,rs=u*2+1;
if(t.tag==0){
pd(ls,0);
pd(rs,0);
}
if(t.tag==1){
pd(ls,1);
pd(rs,1);
}
if(t.tag==3){
pd(ls,3);
pd(rs,3);
}
t.tag=-1,t.rev=0;
}
void updata(int p,int x,int y,int k){
if(tr[p].l>=x&&tr[p].r<=y){
pd(p,k);
return ;
}
int mid=tr[p].l+tr[p].r>>1;
pushdown(p);
if(x<=mid){
updata(p*2,x,y,k);
}
if(y>mid){
updata(p*2+1,x,y,k);
}
pushup(tr[p],tr[p*2],tr[p*2+1]);
}
tree query(int p,int x,int y){
if(y<tr[p].l||x>tr[p].r) return {};
if(tr[p].l>=x&&tr[p].r<=y){
return tr[p];
}
int mid=tr[p].l+tr[p].r>>1;
pushdown(p);
tree T;
pushup(T,query(p*2,x,y),query(p*2+1,x,y));
return T;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--){
int id,l,r;
cin>>id>>l>>r;
l++,r++;
if(id<3){
updata(1,l,r,id);
}
if(id==3){
cout<<query(1,l,r).b<<"\n";
}
if(id==4){
cout<<query(1,l,r).mb<<"\n";
}
}
return 0;
}