rt。。。
原本过了 HACK & 样例但是调后全 WA 了。
# include <bits/stdc++.h>
# define int long long
# define up(i ,x ,y) for (int i = x ; i <= y ; i ++)
# define dn(i ,x ,y) for (int i = x ; i >= y ; i --)
# define lowbit (x) x & -x
using namespace std;
inline int read (){int s = 0 ; bool w = 0 ; char c = getchar () ; while (!isdigit (c)) {w |= (c == '-') ,c = getchar () ;} while (isdigit (c)){s = (s << 1) + (s << 3) + (c ^ 48) ; c = getchar ();}return w ? -s : s;}
inline void write (int x){if (x < 0) putchar ('-') ,x = -x; if (x > 9) write (x / 10) ; putchar (x % 10 | 48);}
inline void writesp (int x){write (x) ,putchar (' ');}
inline void writeln (int x){write (x) ,putchar ('\n');}
const int N = 5e5 + 5;
int n ,Q ,a[N];
struct SGT {
int l ,r ,sum1 ,cov ,lmx[2] ,rmx[2] ,mx[2];
bool rev;
} tr[N << 2];
inline void pushup (int u){
tr[u].sum1 = tr[u << 1].sum1 + tr[u << 1 | 1].sum1;
up (i ,0 ,1){
SGT lft = tr[u << 1] ,rgt = tr[u << 1 | 1];
tr[u].lmx[i] = lft.lmx[i];
if (i == 1 && lft.sum1 == lft.r - lft.l + 1) tr[u].lmx[i] += rgt.lmx[i];
else if (i == 0 && lft.sum1 == 0) tr[u].lmx[i] += rgt.lmx[i];
tr[u].rmx[i] = rgt.rmx[i];
if (i == 1 && rgt.sum1 == rgt.r - rgt.l + 1) tr[u].rmx[i] += rgt.rmx[i];
else if (i == 0 && rgt.sum1 == 0) tr[u].rmx[i] += rgt.rmx[i];
tr[u].mx[i] = max (lft.mx[i] ,max (rgt.mx[i] ,lft.rmx[i] + rgt.lmx[i]));
}
} inline void pushdown (int u){
if (tr[u].cov != -1){
tr[u].rev = 0;
tr[u << 1].sum1 = (tr[u << 1].r - tr[u << 1].l + 1) * tr[u].cov ,
tr[u << 1 | 1].sum1 = (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) * tr[u].cov;
tr[u << 1].lmx[tr[u].cov] = tr[u << 1].rmx[tr[u].cov] = tr[u << 1].mx[tr[u].cov] = tr[u << 1].r - tr[u << 1].l + 1;
tr[u << 1].lmx[tr[u].cov ^ 1] = tr[u << 1].rmx[tr[u].cov ^ 1] = tr[u << 1].mx[tr[u].cov ^ 1] = 0;
tr[u << 1].rev = 0;
tr[u << 1 | 1].lmx[tr[u].cov] = tr[u << 1 | 1].rmx[tr[u].cov] = tr[u << 1 | 1].mx[tr[u].cov] = tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1;
tr[u << 1 | 1].lmx[tr[u].cov ^ 1] = tr[u << 1 | 1].rmx[tr[u].cov ^ 1] = tr[u << 1 | 1].mx[tr[u].cov ^ 1] = 0;
tr[u << 1 | 1].rev = 0;
tr[u].cov = -1;
} if (tr[u].rev){
tr[u << 1].sum1 = (tr[u << 1].r - tr[u << 1].l + 1) - tr[u << 1].sum1 ,
tr[u << 1 | 1].sum1 = (tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1) - tr[u << 1 | 1].sum1;
if (tr[u << 1].cov != -1) tr[u << 1].cov ^= 1 ;
else tr[u << 1].rev ^= 1;
if (tr[u << 1 | 1].cov != -1) tr[u << 1 | 1].cov ^= 1;
else tr[u << 1 | 1].rev ^= 1;
swap (tr[u << 1].lmx[0] ,tr[u << 1].lmx[1]);
swap (tr[u << 1].rmx[0] ,tr[u << 1].rmx[1]);
swap (tr[u << 1].mx[0] ,tr[u << 1].mx[1]);
swap (tr[u << 1 | 1].lmx[0] ,tr[u << 1 | 1].lmx[1]);
swap (tr[u << 1 | 1].rmx[0] ,tr[u << 1 | 1].rmx[1]);
swap (tr[u << 1 | 1].mx[0] ,tr[u << 1 | 1].mx[1]);
tr[u].rev = 0;
}
} inline void build (int u ,int l ,int r){
tr[u].l = l ,tr[u].r = r ,tr[u].cov = -1;
if (l == r){
tr[u].lmx[a[l]] = tr[u].rmx[a[l]] = tr[u].mx[a[l]] = 1;
tr[u].sum1 = a[l];
return ;
}
int mid = ((l + r) >> 1);
build (u << 1 ,l ,mid);
build (u << 1 | 1 ,mid + 1 ,r);
pushup (u);
} inline void modify (int u ,int ql ,int qr ,bool v){
int l = tr[u].l ,r = tr[u].r;
if (l >= ql && r <= qr){
tr[u].cov = v;
tr[u].sum1 = (tr[u].r - tr[u].l + 1) * v;
tr[u].lmx[v] = tr[u].rmx[v] = tr[u].mx[v] = (tr[u].r - tr[u].l + 1);
tr[u].lmx[v ^ 1] = tr[u].rmx[v ^ 1] = tr[u].mx[v ^ 1] = 0;
tr[u].rev = 0;
return ;
}
pushdown (u);
int mid = ((l + r) >> 1);
if (ql <= mid) modify (u << 1 ,ql ,qr ,v);
if (mid < qr) modify (u << 1 | 1 ,ql ,qr ,v);
pushup (u);
} inline void reverse (int u ,int ql ,int qr){
int l = tr[u].l ,r = tr[u].r;
if (l >= ql && r <= qr){
tr[u].rev ^= 1;
tr[u].sum1 = (tr[u].r - tr[u].l + 1) - tr[u].sum1;
swap (tr[u].lmx[0] ,tr[u].lmx[1]);
swap (tr[u].rmx[0] ,tr[u].rmx[1]);
swap (tr[u].mx[0] ,tr[u].mx[1]);
return ;
}
pushdown (u);
int mid = ((l + r) >> 1);
if (ql <= mid) reverse (u << 1 ,ql ,qr);
if (mid < qr) reverse (u << 1 | 1 ,ql ,qr);
pushup (u);
} inline int query1 (int u ,int ql ,int qr){
int l = tr[u].l ,r = tr[u].r;
if (l >= ql && r <= qr) return tr[u].sum1;
pushdown (u);
int mid = ((l + r) >> 1) ,res = 0;
if (ql <= mid) res += query1 (u << 1 ,ql ,qr);
if (mid < qr) res += query1 (u << 1 | 1 ,ql ,qr);
return res;
} inline SGT queryc1 (int u ,int ql ,int qr){
int l = tr[u].l ,r = tr[u].r;
if (l >= ql && r <= qr) return tr[u];
pushdown (u);
int mid = ((l + r) >> 1);
if (qr <= mid) return queryc1 (u << 1 ,ql ,qr);
if (ql > mid) return queryc1 (u << 1 | 1 ,ql ,qr);
SGT lft = queryc1 (u << 1 ,ql ,qr) ,rgt = queryc1 (u << 1 | 1 ,ql ,qr) ,res;
up (i ,0 ,1){
res.lmx[i] = lft.lmx[i];
if (i == 1 && lft.sum1 == lft.r - lft.l + 1) res.lmx[i] += rgt.lmx[i];
else if (i == 0 && lft.sum1 == 0) res.lmx[i] += rgt.lmx[i];
res.rmx[i] = rgt.rmx[i];
if (i == 1 && rgt.sum1 == rgt.r - rgt.l + 1) res.rmx[i] += rgt.rmx[i];
else if (i == 0 && rgt.sum1 == 0) res.rmx[i] += rgt.rmx[i];
res.mx[i] = max (max (lft.mx[i] ,rgt.mx[i]) ,lft.rmx[i] + rgt.lmx[i]);
}
return res;
} signed main (){
n = read () ,Q = read ();
up (i ,1 ,n) a[i] = read ();
build (1 ,1 ,n);
while (Q --){
int op = read () ,l = read () + 1 ,r = read () + 1;
if (op <= 1){
modify (1 ,l ,r ,op);
} else if (op == 2){
reverse (1 ,l ,r);
} else if (op == 3){
writeln (query1 (1 ,l ,r));
} else if (op == 4){
writeln (queryc1 (1 ,l ,r).mx[1]);
}
}
return 0;
}