@Alex_Wei
#include <bits/stdc++.h>
using namespace std;
#define ls p << 1
#define rs p << 1 | 1
const int N = 1e5 + 5;
int n, m;
int opt, ql, qr;
struct node{
int s, mx1, mx0, len;
int l1, r1, l0, r0;
int tg, tg1, tg0;
} t[4 * N];
void pushup(int p)
{
t[p].s = t[ls].s + t[rs].s;
if(t[ls].l1 != t[ls].len) t[p].l1 = t[ls].l1;
else t[p].l1 = t[ls].l1 + t[rs].l1;
if(t[rs].r1 != t[rs].len) t[p].r1 = t[rs].r1;
else t[p].r1 = t[rs].r1 + t[ls].r1;
if(t[ls].l0 != t[ls].len) t[p].l0 = t[ls].l0;
else t[p].l0 = t[ls].l0 + t[rs].l0;
if(t[rs].r0 != t[rs].len) t[p].r0 = t[rs].r0;
else t[p].r0 = t[rs].r0 + t[ls].r0;
t[p].mx1 = max({t[ls].mx1, t[rs].mx1, t[ls].r1 + t[rs].l1});
t[p].mx0 = max({t[ls].mx0, t[rs].mx0, t[ls].r0 + t[rs].l0});
return;
}
void pushdown(int p)
{
if(t[p].tg0)
{
t[ls].s = t[ls].mx1 = t[ls].l1 = t[ls].r1 = 0;
t[ls].mx0 = t[ls].l0 = t[ls].r0 = t[ls].len;
t[rs].s = t[rs].mx1 = t[rs].l1 = t[rs].r1 = 0;
t[rs].mx0 = t[rs].l0 = t[rs].r0 = t[rs].len;
t[ls].tg0 = t[rs].tg0 = 1;
t[ls].tg = t[rs].tg = t[ls].tg1 = t[rs].tg1 = 0; //正确代码
//t[ls].tg = t[rs].tg = 0; 错误代码
}
if(t[p].tg1)
{
t[ls].s = t[ls].mx1 = t[ls].l1 = t[ls].r1 = t[ls].len;
t[ls].mx0 = t[ls].l0 = t[ls].r0 = 0;
t[rs].s = t[rs].mx1 = t[rs].l1 = t[rs].r1 = t[rs].len;
t[rs].mx0 = t[rs].l0 = t[rs].r0 = 0;
t[ls].tg1 = t[rs].tg1 = 1;
t[ls].tg = t[rs].tg = t[ls].tg0 = t[rs].tg0 = 0; //正确代码
//t[ls].tg = t[rs].tg = 0; 错误代码
}
if(t[p].tg)
{
t[ls].s = t[ls].len - t[ls].s;
t[rs].s = t[rs].len - t[rs].s;
swap(t[ls].mx1, t[ls].mx0);
swap(t[rs].mx1, t[rs].mx0);
swap(t[ls].l1, t[ls].l0);
swap(t[rs].l1, t[rs].l0);
swap(t[ls].r1, t[ls].r0);
swap(t[rs].r1, t[rs].r0);
t[ls].tg ^= 1; t[rs].tg ^= 1;
}
t[p].tg0 = t[p].tg1 = t[p].tg = 0;
return;
}
void build(int l, int r, int p)
{
t[p].len = r - l + 1;
if(l == r)
{
cin >> t[p].s;
if(t[p].s) t[p].l1 = t[p].r1 = t[p].mx1 = 1;
else t[p].l0 = t[p].r0 = t[p].mx0 = 1;
return;
}
int mid = (l + r) >> 1;
build(l, mid, ls);
build(mid + 1, r, rs);
pushup(p);
return;
}
void to0(int l, int r, int p)
{
if(ql <= l && r <= qr)
{
t[p].s = t[p].mx1 = t[p].l1 = t[p].r1 = 0;
t[p].mx0 = t[p].l0 = t[p].r0 = t[p].len;
t[p].tg = t[p].tg1 = 0; t[p].tg0 = 1;
return;
}
pushdown(p);
int mid = (l + r) >> 1;
if(ql <= mid) to0(l, mid, ls);
if(qr > mid) to0(mid + 1, r, rs);
pushup(p);
return;
}
void to1(int l, int r, int p)
{
if(ql <= l && r <= qr)
{
t[p].s = t[p].mx1 = t[p].l1 = t[p].r1 = t[p].len;
t[p].mx0 = t[p].l0 = t[p].r0 = 0;
t[p].tg = t[p].tg0 = 0; t[p].tg1 = 1;
return;
}
pushdown(p);
int mid = (l + r) >> 1;
if(ql <= mid) to1(l, mid, ls);
if(qr > mid) to1(mid + 1, r, rs);
pushup(p);
return;
}
void change(int l, int r, int p)
{
if(ql <= l && r <= qr)
{
t[p].s = t[p].len - t[p].s;
swap(t[p].mx1, t[p].mx0);
swap(t[p].l1, t[p].l0);
swap(t[p].r1, t[p].r0);
t[p].tg ^= 1;
return;
}
pushdown(p);
int mid = (l + r) >> 1;
if(ql <= mid) change(l, mid, ls);
if(qr > mid) change(mid + 1, r, rs);
pushup(p);
return;
}
int query(int l, int r, int p)
{
if(ql <= l && r <= qr) return t[p].s;
pushdown(p);
int mid = (l + r) >> 1, sum = 0;
if(ql <= mid) sum += query(l, mid, ls);
if(qr > mid) sum += query(mid + 1, r, rs);
return sum;
}
node find(int l, int r, int p)
{
if(ql <= l && r <= qr) return t[p];
pushdown(p);
int mid = (l + r) >> 1; node ans, t1, t2;
if(ql <= mid) t1 = find(l, mid, ls);
if(qr > mid) t2 = find(mid + 1, r, rs);
if(ql > mid) return t2;
if(qr <= mid) return t1;
if(t1.l1 != t1.len) ans.l1 = t1.l1;
else ans.l1 = t1.l1 + t2.l1;
if(t2.r1 != t2.len) ans.r1 = t2.r1;
else ans.r1 = t2.r1 + t1.r1;
if(t1.l0 != t1.len) ans.l0 = t1.l0;
else ans.l0 = t1.l0 + t2.l0;
if(t2.r0 != t2.len) ans.r0 = t2.r0;
else ans.r0 = t2.r0 + t1.r0;
ans.mx1 = max({t1.mx1, t2.mx1, t1.r1 + t2.l1});
ans.mx0 = max({t1.mx0, t2.mx0, t1.r0 + t2.l0});
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
build(1, n, 1);
while(m --)
{
cin >> opt >> ql >> qr;
ql ++; qr ++;
if(opt == 0) to0(1, n, 1);
else if(opt == 1) to1(1, n, 1);
else if(opt == 2) change(1, n, 1);
else if(opt == 3) cout << query(1, n, 1) << "\n";
else cout << find(1, n, 1).mx1 << "\n";
}
return 0;
}