最烦就是这种线段树。

这道题硬淦就好了,注意标记下传的时候要把另外一个标记清空。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define gc getchar()
#define ll long long
using namespace std;
const int N=2e5+5,mod=1e9+7,M=1e6;
template<class o>
inline void qr(o &x)
{
    x=0;char c=gc;int f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;}
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
    x*=f;
}
template<class o>
void qw(o x)
{
    if(x<0)putchar('-'),x=-x;
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
struct Seg
{
    int s,ls,rs,mx,l,r;bool dl,cr;//del,cover,s为脑组织 
    Seg(){}
    Seg operator +(const Seg a)const
    {
        Seg b;
        b.s=a.s+s;
        b.mx=max(mx,max(a.mx,rs+a.ls));
    //    if(!s)b.mx=max(b.mx,(r-l+1)+a.ls);
    //    if(!a.s)b.mx=max(b.mx,rs+(a.r-a.l+1));
        b.ls=ls;b.rs=a.rs;b.l=l,b.r=a.r;
        b.dl=b.cr=0;
        if(!s)b.ls=max(b.ls,(r-l+1)+a.ls);
        if(!a.s)b.rs=max(b.rs,(a.r-a.l+1)+rs);
        return b;
    }
}t[N<<3];
inline void ccr(int p)
{
    t[p].dl=0;
    t[p].s=t[p].r-t[p].l+1;
    t[p].ls=t[p].rs=0;
    t[p].cr=1;t[p].mx=0;
}
inline void ddl(int p)
{
    t[p].s=0;t[p].cr=0;
    t[p].ls=t[p].rs=t[p].mx=t[p].r-t[p].l+1;
    t[p].dl=1;
}
void pushdown(int p)
{
    if(t[p].cr)ccr(p<<1),ccr(p<<1|1),t[p].cr=0;
    if(t[p].dl)ddl(p<<1),ddl(p<<1|1),t[p].dl=0;
}
void build(int p,int l,int r)
{
    t[p].l=l,t[p].r=r;
    if(l==r){t[p].s=1;t[p].mx=t[p].ls=t[p].rs=0;t[p].cr=t[p].dl=0;return ;}
    int mid=l+r>>1;
    build(p<<1,l,mid);build(p<<1|1,mid+1,r);
    t[p]=t[p<<1]+t[p<<1|1];
}
void del(int p,int L,int R)
{
    if(L<=t[p].l&&R>=t[p].r){ddl(p);return ;}
    int mid=t[p].l+t[p].r>>1;pushdown(p);
    if(L<=mid)del(p<<1,L,R);
    if(R>mid)del(p<<1|1,L,R);
    t[p]=t[p<<1]+t[p<<1|1];
}
int tot;
void cov(int p,int L,int R)
{
    if(L<=t[p].l&&R>=t[p].r)
    {
        int sum=t[p].r-t[p].l+1-t[p].s;pushdown(p);
        if(tot>=sum){tot-=sum,ccr(p);return ;}
        if(tot)cov(p<<1,L,R);
        if(tot)cov(p<<1|1,L,R);
        if(t[p].l!=t[p].r)t[p]=t[p<<1]+t[p<<1|1];
        return ;
    }
    int mid=t[p].l+t[p].r>>1;pushdown(p);
    if(L<=mid)cov(p<<1,L,R);
    if(R>mid)cov(p<<1|1,L,R);
    t[p]=t[p<<1]+t[p<<1|1];
}
int qsum(int p,int L,int R)
{
    if(L<=t[p].l&&R>=t[p].r)return t[p].s;
    int mid=t[p].l+t[p].r>>1,val=0;pushdown(p);
    if(L<=mid)val+=qsum(p<<1,L,R);
    if(R>mid)val+=qsum(p<<1|1,L,R);
    return val;
}
Seg qmx(int p,int L,int R)
{
    if(L<=t[p].l&&R>=t[p].r)return t[p];
    int mid=t[p].l+t[p].r>>1;Seg lp,rp;bool lk=L<=mid,rk=R>mid;pushdown(p);
    if(lk)lp=qmx(p<<1,L,R);if(rk)rp=qmx(p<<1|1,L,R);
    if(lk&&rk)return lp+rp;
    if(lk)return lp;
    return rp;
}
int main()
{
//    freopen("brainhole3.in","r",stdin);
//    freopen("brainhole3.ans","w",stdout);
    int n,m;qr(n),qr(m);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int op,l0,r0;qr(op),qr(l0),qr(r0);
        if(i==30)
            i++,i--;
        if(!op)del(1,l0,r0);
        else if(op==1)
        {
            int l1,r1;qr(l1),qr(r1);
            tot=qsum(1,l0,r0);del(1,l0,r0);
            if(tot)cov(1,l1,r1);
        }
        else qw(qmx(1,l0,r0).mx),puts("");
    }
    return 0;
}