rt,之前WA,下载数据2后发现本地RE,提交AC了。
#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;
struct seg{
int lb;
int ub;
int datas;
int datam;
int ldat;
int rdat;
int tag;
}tr[4*200007];
int n,m,o,l,r,l0,r0,l1,r1;
seg calu(seg ls,seg rs){
seg tmp;
tmp.lb=ls.lb;
tmp.ub=rs.ub;
tmp.ldat=ls.ldat;
if(ls.datas==0) tmp.ldat=max((ls.ub-ls.lb+1)+rs.ldat,tmp.ldat);
tmp.rdat=rs.rdat;
if(rs.datas==0) tmp.rdat=max((rs.ub-rs.lb+1)+ls.rdat,tmp.rdat);
tmp.datam=max(ls.rdat+rs.ldat,max(ls.datam,rs.datam));
tmp.datas=ls.datas+rs.datas;
tmp.tag=-1;
return tmp;
}
void pushup(int k){
tr[k]=calu(tr[k<<1],tr[(k<<1)|1]);
return;
}
void pushdown(int k){
int tg=tr[k].tag;
if(tg==-1)
return;
if(tg==0){
tr[k<<1].rdat=tr[k<<1].ldat=tr[k<<1].datam=tr[k<<1].ub-tr[k<<1].lb+1,tr[k<<1].datas=0;
tr[(k<<1)|1].rdat=tr[(k<<1)|1].ldat=tr[(k<<1)|1].datam=tr[(k<<1)|1].ub-tr[(k<<1)|1].lb+1,tr[(k<<1)|1].datas=0;
}
if(tg==1){
tr[k<<1].rdat=tr[k<<1].ldat=tr[k<<1].datam=0,tr[k<<1].datas=tr[k<<1].ub-tr[k<<1].lb+1;
tr[(k<<1)|1].rdat=tr[(k<<1)|1].ldat=tr[(k<<1)|1].datam=0,tr[(k<<1)|1].datas=tr[(k<<1)|1].ub-tr[(k<<1)|1].lb+1;
}
tr[k<<1].tag=tr[(k<<1)|1].tag=tg;
tr[k].tag=-1;
return;
}
void build(int k,int a,int b){
tr[k].lb=a;tr[k].ub=b;tr[k].tag=-1;
if(a==b){
tr[k].datas=1;
return;
}
int mid=(tr[k].lb+tr[k].ub)>>1;
build(k<<1,a,mid);
build((k<<1)|1,mid+1,b);
pushup(k);
}
void upd(int k,int a,int b,int x){
if(a<=tr[k].lb&&tr[k].ub<=b){
//pushdown(k);
if(x==0)
tr[k].rdat=tr[k].ldat=tr[k].datam=tr[k].ub-tr[k].lb+1,tr[k].datas=0;
if(x==1)
tr[k].rdat=tr[k].ldat=tr[k].datam=0,tr[k].datas=tr[k].ub-tr[k].lb+1;
tr[k].tag=x;
return;
}
pushdown(k);
int mid=(tr[k].lb+tr[k].ub)>>1;
if(a<=mid) upd(k<<1,a,b,x);
if(b>mid) upd((k<<1)|1,a,b,x);
pushup(k);
}
seg query(int k,int a,int b){
if(a<=tr[k].lb&&tr[k].ub<=b){
return tr[k];
}
pushdown(k);
int mid=(tr[k].lb+tr[k].ub)>>1;
//pushup(k);
if(a<=mid&&b>mid){
return calu(query(k<<1,a,b),query((k<<1)|1,a,b));
}
if(a<=mid) return query(k<<1,a,b);
if(b>mid) return query((k<<1)|1,a,b);
}
signed main(){
//freopen("P4344_2.in","r",stdin),freopen("std_2.out","w",stdout);
scanf("%d%d",&n,&m);
build(1,1,n);
for(int j=1;j<=m;j++){
scanf("%d",&o);
if(o==0){
scanf("%d%d",&l,&r);
upd(1,l,r,0);
}
if(o==1){
scanf("%d%d%d%d",&l0,&r0,&l1,&r1);
int s0=(query(1,l0,r0)).datas;
if(s0==0) continue;
upd(1,l0,r0,0);
//printf("%lld\n",s0);
int lb=l1,ub=r1,ans;
while(lb<=ub){
//printf("%lld %lld\n",lb,ub);
int mid=(lb+ub)>>1;
int sq=(query(1,l1,mid)).datas;
int fuls=mid-l1+1;
if((fuls-sq)<=s0)
ans=mid,lb=mid+1;
else
ub=mid-1;
}
upd(1,l1,ans,1);
}
if(o==2){
scanf("%d%d",&l,&r);
seg q=query(1,l,r);
printf("%d\n",q.datam);
}
}
return 0;
}