#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e5 + 5;
void push_down(ll k);
struct tree{
ll l,r;
ll lazy,k,lazy1;
ll ans0,ans1,all1,all0;
ll left0,right0,left1,right1;
}X[N * 4];
ll n,m,op,x,y;
ll a[N];
string s;
void SWAP(ll k){
swap(X[k].ans0,X[k].ans1);
swap(X[k].left0,X[k].left1);
swap(X[k].right0,X[k].right1);
swap(X[k].all1,X[k].all0);
}
void pushup(ll k){
push_down(k);
X[k].left0 = X[k * 2].left0;
if(X[k * 2].k == X[k * 2].left0) X[k].left0 += X[k * 2 + 1].left0;
X[k].right0 = X[k * 2 + 1].right0;
if(X[k * 2 + 1].k == X[k * 2 + 1].right0) X[k].right0 += X[k * 2].right0;
X[k].left1 = X[k * 2].left1;
if(X[k * 2].k == X[k * 2].left1) X[k].left1 += X[k * 2 + 1].left1;
X[k].right1 = X[k * 2 + 1].right1;
if(X[k * 2 + 1].k == X[k * 2 + 1].right1) X[k].right1 += X[k * 2].right1;
X[k].ans0 = max(max(X[k * 2].ans0,X[k * 2 + 1].ans0),X[k * 2].right0 + X[k * 2 + 1].left0);
X[k].ans1 = max(max(X[k * 2].ans1,X[k * 2 + 1].ans1),X[k * 2].right1 + X[k * 2 + 1].left1);
X[k].all0 = X[k * 2].all0 + X[k * 2 + 1].all0;
X[k].all1 = X[k * 2].all1 + X[k * 2 + 1].all1;
}
void build(ll k,ll l,ll r){
X[k].l = l,X[k].r = r;
X[k].lazy = 0;
X[k].k = r - l + 1;
if(l == r){
X[k].all0 = X[k].ans0 = X[k].left0 = X[k].right0 = !a[l];
X[k].all1 = X[k].ans1 = X[k].left1 = X[k].right1 = a[l];
return ;
}
ll mid = (l + r) >> 1;
build(k * 2, l, mid);
build(k * 2 + 1,mid + 1, r);
pushup(k);
return;
}
void push_down(ll k){
if(X[k].lazy1){
X[k * 2].lazy1 = X[k].lazy1;
X[k * 2 + 1].lazy1 = X[k].lazy1;
if(X[k].lazy1 == 1){
X[k * 2].ans0 = X[k * 2].all0 = X[k * 2].left0 = X[k * 2].right0 = X[k * 2].k;
X[k * 2].ans1 = X[k * 2].all1 = X[k * 2].left1 = X[k * 2].right1 = 0;
X[k * 2 + 1].ans0 = X[k * 2 + 1].all0 = X[k * 2 + 1].left0 = X[k * 2 + 1].right0 = X[k * 2 + 1].k;
X[k * 2 + 1].ans1 = X[k * 2 + 1].all1 = X[k * 2 + 1].left1 = X[k * 2 + 1].right1 = 0;
}
if(X[k].lazy1 == 2){
X[k * 2].ans1 = X[k * 2].all1 = X[k * 2].left1 = X[k * 2].right1 = X[k * 2].k;
X[k * 2].ans0 = X[k * 2].all0 = X[k * 2].left0 = X[k * 2].right0 = 0;
X[k * 2 + 1].ans1 = X[k * 2 + 1].all1 = X[k * 2 + 1].left1 = X[k * 2 + 1].right1 = X[k * 2 + 1].k;
X[k * 2 + 1].ans0 = X[k * 2 + 1].all0 = X[k * 2 + 1].left0 = X[k * 2 + 1].right0 = 0;
}
X[k].lazy1 = 0,X[k].lazy = 0;
}
else if(X[k].lazy){
X[k * 2].lazy ^= 1;
X[k * 2 + 1].lazy ^= 1;
SWAP(k * 2);
SWAP(k * 2 + 1);
X[k].lazy = 0;
}
return;
}
void fan(ll k,ll l,ll r){
push_down(k);
if(X[k].l >= l && X[k].r <= r){
X[k].lazy ^= 1, SWAP(k);
return ;
}
if(X[k].l > r || X[k].r < l) return;
push_down(k);
fan(k << 1,l,r);
fan(k << 1 | 1,l,r);
pushup(k);
return ;
}
tree search(ll k,ll l,ll r){
push_down(k);
if(X[k].l >= l && X[k].r <= r) return X[k];
push_down(k);
ll mid = (X[k].l + X[k].r) >> 1;
if(r <= mid) return search(k << 1,l,r);
if(l > mid) return search(k << 1 | 1,l,r);
tree x = search(k << 1,l,r),y = search(k << 1 | 1,l,r),z;
z.left1 = x.left1;
if(x.left1 == x.k) z.left1 += y.left1;
z.right1 = y.right1;
if(y.right1 == y.k) z.right1 += x.right1;
z.k = x.k + y.k;
z.ans1 = max(max(x.ans1,y.ans1),x.right1 + y.left1);
return z;
}
void change1(int k,int l,int r){
push_down(k);
if(X[k].l > r || X[k].r < l) return;
push_down(k);
if(X[k].l >= l && X[k].r <= r){
X[k].lazy1 = x + 1;
X[k].left0 = X[k].right0 = X[k].ans0 = X[k].all0 = 0;
X[k].left1 = X[k].right1 = X[k].ans1 = X[k].all1 = X[k].k;
return;
}
change1(k * 2,l,r);
change1(k * 2 + 1,l,r);
pushup(k);
return;
}
void change0(int k,int l,int r){
push_down(k);
if(X[k].l > r || X[k].r < l) return;
push_down(k);
if(X[k].l >= l && X[k].r <= r){
X[k].lazy1 = x + 1;
X[k].left0 = X[k].right0 = X[k].ans0 = X[k].all0 = X[k].k;
X[k].left1 = X[k].right1 = X[k].ans1 = X[k].all1 = 0;
return;
}
change0(k * 2,l,r);
change0(k * 2 + 1,l,r);
pushup(k);
return;
}
long long search1(ll k,ll l,ll r){
push_down(k);
if(X[k].l >= l && r >= X[k].r) return X[k].all1 ;
if(X[k].l > r || X[k].r < l) return 0;
return search1(k * 2,l,r) + search1(k * 2 + 1,l ,r);
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){cin >> a[i];}
build(1,1,n);
while(m--){
cin >> op >> x >> y;
x++,y++;
if(op == 0)change0(1,x,y);
if(op == 1)change1(1,x,y);
//if(op == 0 || op == 1) change(op,1,x,y);
if(op == 2) fan(1,x,y);
if(op == 3) cout << search1(1,x,y) << endl;
if(op == 4) cout << search(1,x,y).ans1 << endl;
}
return 0;
}
/*
10 10
0 1 0 1 1 0 1 0 0 1
2 1 2
4 7 7
4 0 3
1 0 6
2 0 9
3 1 9
3 2 6
2 1 2
4 2 6
3 4 6
0
2
2
0
1
0
*/
最后注释掉的是一组 hack 数据,可是我过不了它