写挂了

明天再调

#include <bits/stdc++.h>
#define il inline
#define Max 500005
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
int n,m,t[Max],rv[Max],mx[Max][2],lx[Max][2],rx[Max][2],tg[Max],v[Max];
il int read()
{
    char c=getchar();
    int x=0;
    while(c>'9'||c<'0')
        c=getchar();
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}
il void pushup(int x,int l,int r)
{
    t[x]=t[ls(x)]+t[rs(x)];
    int mid=(l+r)>>1;
    for(int i=0;i<=1;i++)
    {
        lx[x][i]=lx[ls(x)][i];
        if(i&&t[ls(x)]==(mid-l+1)) lx[x][i]+=lx[rs(x)][i];
        if(!i&&!t[ls(x)]) lx[x][i]+=lx[rs(x)][i];
        rx[x][i]=rx[rs(x)][i];
        if(i&&t[rs(x)]==(r-mid)) rx[x][i]+=rx[ls(x)][i];
        if(!i&&!t[rs(x)]) rx[x][i]+=rx[ls(x)][i];
        mx[x][i]=lx[rs(x)][i]+rx[(ls(x))][i];
        mx[x][i]=max(mx[x][i],max(mx[ls(x)][i],mx[rs(x)][i]));
    }
}
il void pushdown(int x,int l,int r)
{
    if(tg[x]!=-1)
    {
        int w=tg[x],mid=(l+r)>>1;
        tg[x]=-1;
        rv[x]=rv[ls(x)]=rv[rs(x)]=0;
        tg[rs(x)]=tg[ls(x)]=w;
        t[ls(x)]=(mid-l+1)*w;
        t[rs(x)]=(r-mid)*w;
        mx[ls(x)][w]=lx[ls(x)][w]=rx[ls(x)][w]=mid-l+1;
        mx[rs(x)][w]=lx[rs(x)][w]=rx[ls(x)][w]=r-mid;
        w^=1;
        mx[ls(x)][w]=mx[rs(x)][w]=lx[ls(x)][w]=lx[rs(x)][w]=rx[ls(x)][w]=rx[rs(x)][w]=0;
    }
    if(rv[x])
    {
        int mid=(l+r)>>1;
        rv[x]=0;
        t[ls(x)]=mid-l+1-t[ls(x)];
        t[rs(x)]=r-mid-t[rs(x)];
        if(tg[ls(x)]!=-1) tg[ls(x)]^=1;
        else rv[ls(x)]^=1;
        if(tg[rs(x)]!=-1) tg[rs(x)]^=1;
        else rv[rs(x)]^=1;
        swap(lx[ls(x)][1],lx[ls(x)][0]);
        swap(rx[ls(x)][1],rx[ls(x)][0]);
        swap(lx[rs(x)][1],lx[rs(x)][0]);
        swap(rx[rs(x)][1],rx[rs(x)][0]);
        swap(mx[ls(x)][0],mx[ls(x)][1]);
        swap(mx[rs(x)][0],mx[rs(x)][1]);
    }
}
il void build(int x,int l,int r)
{
    tg[x]=-1;
    if(l==r)
    {
        t[x]=v[l];
        mx[x][0]=lx[x][0]=rx[x][0]=!v[l];
        mx[x][1]=lx[x][1]=rx[x][1]=v[l];
        return;
    }
    int mid=(l+r)>>1;
    build(ls(x),l,mid);
    build(rs(x),mid+1,r);
    pushup(x,l,r);
}
struct node
{
    int lx,rx,mx,len;
    node(int L=0,int R=0,int M=0,int LN=0)
    {
        lx=L,rx=R,mx=M,len=LN;
    }
};
il void mdf(int x,int l,int r,int ql,int qr,int w)
{
    if(ql<=l&&r<=qr)
    {
        if(w==2)
        {
            t[x]=r-l+1-t[x];
            rv[x]^=1;
            swap(lx[x][1],lx[x][0]);
            swap(rx[x][1],rx[x][0]);
            swap(mx[x][1],mx[x][0]);
        }
        else
        {
            t[x]=(r-l+1)*w;
            tg[x]=w;
            mx[x][w]=lx[x][w]=rx[x][w]=r-l+1;
            w^=1;
            mx[x][w]=lx[x][w]=rx[x][w]=0;
        }
        return;
    }
    pushdown(x,l,r);
    int mid=(l+r)>>1;
    if(ql<=mid) mdf(ls(x),l,mid,ql,qr,w);
    if(qr>mid) mdf(rs(x),mid+1,r,ql,qr,w);
    pushup(x,l,r);
}
il int qry(int x,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)
    {
        return t[x];
    }
    pushdown(x,l,r);
    int mid=(l+r)>>1,res=0;
    if(ql<=mid) res+=qry(ls(x),l,mid,ql,qr);
    if(qr>mid) res+=qry(rs(x),mid+1,r,ql,qr);
    return res;
}
il node qmax(int x,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)
    {
        return node(lx[x][1],rx[x][1],mx[x][1],r-l+1);
    }
    pushdown(x,l,r);
    int mid=(l+r)>>1;
    if(ql>mid) return qmax(rs(x),mid+1,r,ql,qr);
    else if(qr<=mid) return qmax(ls(x),l,mid,ql,qr);
    else
    {
        node tl=qmax(ls(x),l,mid,ql,qr),tr=qmax(rs(x),mid+1,r,ql,qr);
        return node((tl.lx==tl.len?tl.lx+tr.lx:tl.lx),
                    (tr.rx==tr.len?tr.rx+tl.rx:tr.rx),
                    max(max(tl.mx,tr.mx),tl.rx+tr.lx),
                    tl.len+tr.len);
    }
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++) v[i]=read();
    build(1,1,n);
    while(m--)
    {
        int opt=read(),l=read()+1,r=read()+1;
        if(opt<3) mdf(1,1,n,l,r,opt);
        else if(opt==4) printf("%d\n",qry(1,1,n,l,r));
        else printf("%d\n",qmax(1,1,n,l,r).mx);
    }
}