#include<iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
#define xx return
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
const int N=1e5+10;
int n,m;
int a[N];
struct Tree{
int l,r;
int sum,tag,rev;
int max_n[2],lmax[2],rmax[2];
#define l(x) t[x].l
#define r(x) t[x].r
#define sum(x) t[x].sum
#define tag(x) t[x].tag
#define siz(x) t[x].r-t[x].l+1
#define rev(x) t[x].rev
#define lmax(x,i) t[x].lmax[i]
#define rmax(x,i) t[x].rmax[i]
#define max_n(x,i) t[x].max_n[i]
}t[N*4];
void push_up(int p)
{
sum(p)=sum(p*2)+sum(p*2+1);
rep(i,0,1)
{
lmax(p,i)=lmax(p*2,i);
if((i==1&&sum(p*2)==siz(p*2))||(i==0&&sum(p*2)==0))
lmax(p,i)+=lmax(p*2+1,i);
rmax(p,i)=rmax(p*2+1,i);
if((i==1&&sum(p*2+1)==siz(p*2+1))||(i==0&&sum(p*2+1)==0))
rmax(p,i)+=rmax(p*2,i);
max_n(p,i)=rmax(p*2,i)+lmax(p*2+1,i);
max_n(p,i)=max(max_n(p,i),max_n(p*2,i));
max_n(p,i)=max(max_n(p,i),max_n(p*2+1,i));
}
}
void push_down(int p)
{
if(tag(p)!=-1)
{
rev(p)=0;
int val=tag(p);
sum(p*2)=siz(p*2)*val;
sum(p*2+1)=siz(p*2+1)*val;
tag(p*2)=tag(p*2+1)=tag(p);
rev(p*2)=rev(p*2+1)=0;
max_n(p*2,val)=lmax(p*2,val)=rmax(p*2,val)=siz(p*2);
max_n(p*2,val^1)=lmax(p*2,val^1)=rmax(p*2,val^1)=0;
max_n(p*2+1,val)=lmax(p*2+1,val)=rmax(p*2+1,val)=siz(p*2+1);
max_n(p*2+1,val^1)=lmax(p*2+1,val^1)=rmax(p*2+1,val^1)=0;
tag(p)=-1;
}
if(rev(p)){
sum(p*2)=siz(p*2)-sum(p*2);
sum(p*2+1)=siz(p*2+1)-sum(p*2+1);
if(tag(p*2)!=-1)tag(p*2)^=1;
else rev(p*2)^=1;
if(tag(p*2+1)!=-1)tag(p*2+1)^=1;
else rev(p*2+1)^=1;
swap(max_n(p*2,0),max_n(p*2,1));
swap(lmax(p*2,0),lmax(p*2,1));
swap(rmax(p*2,0),rmax(p*2,1));
swap(max_n(p*2+1,0),max_n(p*2+1,1));
swap(lmax(p*2+1,0),lmax(p*2+1,1));
swap(rmax(p*2+1,0),rmax(p*2+1,1));
rev(p)=0;
}
}
void build(int p,int l,int r)
{
l(p)=l,r(p)=r;
tag(p)=-1;
if(l==r){
sum(p)=a[l];
max_n(p,0)=lmax(p,0)=rmax(p,0)=(a[l]==0);
max_n(p,1)=lmax(p,1)=rmax(p,1)=(a[l]==1);
xx;
}
int mid=l+r>>1;
build(p*2,l,mid),build(p*2+1,mid+1,r);
push_up(p);
}
void change(int p,int L,int R,int id)
{
push_down(p);
if(L==l(p)&&r(p)==R){
if(id==1||id==0){
sum(p)=siz(p)*id;
tag(p)=id;
max_n(p,id)=lmax(p,id)=rmax(p,id)=siz(p);
max_n(p,id^1)=lmax(p,id^1)=rmax(p,id^1)=0;
}else{
sum(p)=siz(p)-sum(p);
rev(p)^=1;
swap(max_n(p,0),max_n(p,1));
swap(lmax(p,0),lmax(p,1));
swap(rmax(p,0),rmax(p,1));
}
xx;
}
int mid=l(p)+r(p)>>1;
if(mid<L)change(p*2+1,L,R,id);
else if(R<=mid)change(p*2,L,R,id);
else change(1,L,mid,id),change(1,mid+1,R,id);
push_up(p);
}
int ask_1(int p,int L,int R){
push_down(p);
if(L==l(p)&&r(p)==R)xx sum(p);
int mid=l(p)+r(p)>>1;
if(mid<L)xx ask_1(p*2+1,L,R);
else if(mid>=R)xx ask_1(p*2,L,R);
else xx ask_1(p*2,L,mid)+ask_1(p*2+1,mid+1,R);
}
Tree ask_2(int p,int L,int R)
{
push_down(p);
if(L==l(p)&&r(p)==R)xx t[p];
int mid=l(p)+r(p)>>1;
if(mid<L)xx ask_2(p*2+1,L,R);
else if(mid>=R)xx ask_2(p*2,L,R);
else{
Tree k,LL=ask_2(p*2,L,mid),RR=ask_2(p*2+1,mid+1,R);
k.sum=LL.sum+RR.sum;
rep(i,0,1){
k.lmax[i]=LL.lmax[i];
if(i==1&&LL.sum==LL.r-LL.l+1)k.lmax[i]+=RR.lmax[i];
else if(i==0&&LL.sum==0)k.lmax[i]+=RR.lmax[i];
k.rmax[i]=RR.rmax[i];
if(i==1&&RR.sum==RR.r-RR.l+1)k.rmax[i]+=LL.rmax[i];
else if(i==0&&RR.sum==0)k.rmax[i]+=LL.rmax[i];
k.max_n[i]=LL.rmax[i]+RR.lmax[i];
k.max_n[i]=max(k.max_n[i],LL.max_n[i]);
k.max_n[i]=max(k.max_n[i],RR.max_n[i]);
}
xx k;
}
}
void solve()
{
scanf("%d%d",&n,&m);
rep(i,1,n)scanf("%d",&a[i]);
build(1,1,n);
while(m--)
{
int op,l,r;
scanf("%d%d%d",&op,&l,&r);l++,r++;
if(op==0||op==1||op==2)change(1,l,r,op);
else if(op==3)printf("%d\n",ask_1(1,l,r));
else printf("%d\n",ask_2(1,l,r).max_n[1]);
}
xx;
}
signed main()
{
solve();
xx 0;
}
就只过了#11,样例也没过,调不出来。。。