#include<bits/stdc++.h>
using namespace std;
const char n1='\n',n2=' ';
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define de1(a) cout<<#a<<" = "<<a<<n1;
#define de2(a) cout<<#a<<" = "<<a<<n2;
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define all1(x) (x).begin()+1,(x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
#define sz0(x) sz(x)-1
#define me(a,x) memset(a,x,sizeof(a))
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef vector<string> vs;
typedef pair<int,int> pii;
typedef map<ll,ll> mll;
typedef pair<ll,ll> pll;
typedef map<int,int> mii;
const int N=200010;
struct info{
int pre[2];
int suf[2];
int mx[2];
int sum[2];
int tot;
bool ept;
info(){ept=true;}
info operator +(const info &b)const{
if(ept)return b;
if(b.ept)return *this;
info ret;
ret.ept=false;
ret.tot=tot+b.tot;
rep(i,0,1){
ret.sum[i]=sum[i]+b.sum[i];
ret.pre[i]=pre[i]+(pre[i]==tot?b.pre[i]:0);
ret.suf[i]=b.suf[i]+(b.suf[i]==b.tot?suf[i]:0);
ret.mx[i]=max({mx[i],b.mx[i],suf[i]+b.pre[i]});
}
return ret;
}
};
int a[N];
struct sgt{
#define mid (l+r>>1)
#define ls u<<1
#define rs u<<1|1
#define up(u) tr[u]=tr[ls]+tr[rs]
int n;
vector<info> tr;
vi tag,re;
sgt(int n):n(n),tr(n<<3),re(n<<3),tag(n<<3,-1){}
void bd(int u,int l,int r){
if(l==r){
tr[u].tot=1;
tr[u].ept=false;
int t=a[l];
rep(i,0,1){
tr[u].pre[i]=tr[u].suf[i]=tr[u].mx[i]=tr[u].sum[i]=(i==t);
}
return;
}
bd(ls,l,mid);
bd(rs,mid+1,r);
up(u);
}
void take(int u,int c){
if(c==0||c==1){
tr[u].sum[c]=tr[u].mx[c]=tr[u].pre[c]=tr[u].suf[c]=tr[u].tot;
tr[u].sum[c^1]=tr[u].mx[c^1]=tr[u].pre[c^1]=tr[u].suf[c^1]=0;
tag[u]=c;
re[u]=0;
}
else{
swap(tr[u].pre[0],tr[u].pre[1]);
swap(tr[u].suf[0],tr[u].suf[1]);
swap(tr[u].sum[0],tr[u].sum[1]);
swap(tr[u].mx[0],tr[u].mx[1]);
if(tag[u]!=-1){
tag[u]^=1;
}
else{
re[u]^=1;
}
}
}
void pd(int u){
if(tag[u]!=-1){
take(ls,tag[u]);
take(rs,tag[u]);
re[u]=0;
tag[u]=-1;
}
if(re[u]){
take(ls,2);
take(rs,2);
re[u]=0;
}
}
void modify(int u,int l,int r,int ql,int qr,int c){
pd(u);
if(l>=ql&&r<=qr){
take(u,c);
return;
}
if(ql<=mid){
modify(ls,l,mid,ql,qr,c);
}
if(mid<qr){
modify(rs,mid+1,r,ql,qr,c);
}
up(u);
}
info query(int u,int l,int r,int ql,int qr){
if(l>=ql&&r<=qr){
return tr[u];
}
pd(u);
info ret;
if(ql<=mid){
ret=query(ls,l,mid,ql,qr);
}
if(mid<qr){
ret=ret+query(rs,mid+1,r,ql,qr);
}
return ret;
}
};
void solve(){
int n,q;
cin>>n>>q;
rep(i,1,n)cin>>a[i];
sgt tr(n);
tr.bd(1,1,n);
while(q--){
int op,l,r;
cin>>op>>l>>r;
l++,r++;
if(op<=2){
tr.modify(1,1,n,l,r,op);
}
else{
int res;
if(op==3){
res=tr.query(1,1,n,l,r).sum[1];
}
else{
res=tr.query(1,1,n,l,r).mx[1];
}
cout<<res<<n1;
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int T=1;
// cin>>T;
while(T--)solve();
return 0;
}
代码风格不是很好,希望大佬别拷打马蜂