rt,样例2都过不了
#include<bits/stdc++.h>
using namespace std;
#define lid id<<1
#define rid id<<1|1
#define mid ((tr[id].l+tr[id].r)>>1)
const int N=2e5+5;
struct node{
int l,r;
int sum;
int mx1,mx2;
int tag1,tag2,tag3,tag4;
}tr[N<<2];
int n,m;
int op,l,r,k;
void pushup(int id){
tr[id].sum=tr[lid].sum+tr[rid].sum;
tr[id].mx1=max(tr[lid].mx1,tr[rid].mx1);
tr[id].mx2=max(tr[lid].mx2,tr[rid].mx2);
}
void pushdown(int id){
if(tr[id].tag1!=-1){
tr[lid].tag3=tr[rid].tag3=0;
tr[lid].tag1=tr[rid].tag1=tr[id].tag1;
tr[lid].mx1=tr[rid].mx1=tr[id].tag1;
tr[id].tag1=-1;
}
if(tr[id].tag2!=-1){
tr[lid].tag4=tr[rid].tag4=0;
tr[lid].tag2=tr[rid].tag2=tr[id].tag2;
tr[lid].mx2=tr[rid].mx2=tr[id].tag2;
tr[id].tag1=-1;
}
if(tr[id].tag3){
tr[lid].tag3+=tr[id].tag3;
tr[rid].tag3+=tr[id].tag3;
tr[lid].mx1+=tr[id].tag3;
tr[rid].mx1+=tr[id].tag3;
tr[id].tag3=0;
}
if(tr[id].tag4){
tr[lid].tag4+=tr[id].tag4;
tr[rid].tag4+=tr[id].tag4;
tr[lid].mx2+=tr[id].tag4;
tr[rid].mx2+=tr[id].tag4;
tr[id].tag4=0;
}
}
void build(int id,int l,int r){
tr[id].l=l,tr[id].r=r;
tr[id].tag1=tr[id].tag2=-1;
if(l==r){
tr[id].sum=1;
return;
}
build(lid,l,mid),build(rid,mid+1,r);
pushup(id);
}
void change1(int id,int l,int r,int x){
if(r<l) return;
if(l==tr[id].l&&r==tr[id].r){
tr[id].tag3=0;
tr[id].tag1=tr[id].mx1=x;
return;
}
pushdown(id);
if(r<=mid) change1(lid,l,r,x);
else if(l>mid) change1(rid,l,r,x);
else change1(lid,l,mid,x),change1(rid,mid+1,r,x);
pushup(id);
}
void change2(int id,int l,int r,int x){
if(r<l) return;
if(l==tr[id].l&&r==tr[id].r){
tr[id].tag4=0;
tr[id].tag2=tr[id].mx2=x;
return;
}
pushdown(id);
if(r<=mid) change2(lid,l,r,x);
else if(l>mid) change2(rid,l,r,x);
else change2(lid,l,mid,x),change2(rid,mid+1,r,x);
pushup(id);
}
void add1(int id,int l,int r,int x){
if(r<l) return;
if(l==tr[id].l&&r==tr[id].r){
tr[id].tag3+=x;
tr[id].mx1+=x;
return;
}
pushdown(id);
if(r<=mid) add1(lid,l,r,x);
else if(l>mid) add1(rid,l,r,x);
else add1(lid,l,mid,x),add1(rid,mid+1,r,x);
pushup(id);
}
void add2(int id,int l,int r,int x){
if(r<l) return;
if(l==tr[id].l&&r==tr[id].r){
tr[id].tag4+=x;
tr[id].mx2+=x;
return;
}
pushdown(id);
if(r<=mid) add2(lid,l,r,x);
else if(l>mid) add2(rid,l,r,x);
else add2(lid,l,mid,x),add2(rid,mid+1,r,x);
pushup(id);
}
void del(int id,int l,int r,int x){
// cout<<l<<' '<<r<<' '<<tr[id].mx1<<' '<<tr[id].mx2<<endl;
if(max(tr[id].mx1,tr[id].mx2)<x||!tr[id].sum) return;
if(tr[id].l==tr[id].r){
tr[id].sum=0;
cout<<l<<endl;
return;
}
pushdown(id);
if(r<=mid) del(lid,l,r,x);
else if(l>mid) del(rid,l,r,x);
else del(lid,l,mid,x),del(rid,mid+1,r,x);
pushup(id);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);
cin>>n>>m;
build(1,1,n);
while(m--){
cin>>op;
if(op==1){
cin>>l>>r>>k;
change1(1,1,l-1,0);
change2(1,l,r,0);
change1(1,r+1,n,0);
add2(1,1,l-1,k);
add1(1,l,r,k);
add2(1,r+1,n,k);
}
if(op==2){
cin>>l>>r>>k;
del(1,l,r,k);
}
if(op==3){
cout<<tr[1].sum<<endl;
}
}
return 0;
}