AC on #1#11#13,其他 WA。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=5e4+100,INF=0x3f3f3f3f;
int n,m,ans[N];
ll tag[N*4];
ll ma=-INF,mi=INF;
struct node
{
int op,x,y,id;
ll c;
}a[N],b1[N],b2[N];
struct node2
{
int tl,tr;
ll val;
}t[N*4];
void build(int p,int l,int r)
{
int mid=(l+r)/2;
tag[p]=0;
t[p].tl=l,t[p].tr=r;
if(l==r) return;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
void add_tag(int p,ll num)
{
tag[p]+=num;
t[p].val+=num*(t[p].tr-t[p].tl+1);
}
void push_down(int p)
{
if(!tag[p]) return;
add_tag(p*2,tag[p]);
add_tag(p*2+1,tag[p]);
tag[p]=0;
}
void update(int p,int l,int r,ll num)
{
int mid=(t[p].tl+t[p].tr)/2;
if(l<=t[p].tl&&r>=t[p].tr)
{
add_tag(p,num);
return;
}
push_down(p);
if(l<=mid) update(p*2,l,r,num);
if(r>mid) update(p*2+1,l,r,num);
t[p].val=t[p*2].val+t[p*2+1].val;
}
ll query(int p,int l,int r)
{
int mid=(t[p].tl+t[p].tr)/2;
ll sum=0;
if(l<=t[p].tl&&r>=t[p].tr) return t[p].val;
push_down(p);
if(l<=mid) sum+=query(p*2,l,r);
if(r>mid) sum+=query(p*2+1,l,r);
return sum;
}
void whole_binary_find(int l,int r,int ql,int qr)
{
//printf("%d %d %d %d\n",l,r,ql,qr);
int mid=(l+r)>>1,k1=0,k2=0;
ll cnt;
if(ql>qr) return;
if(l==r)
{
for(int i=ql;i<=qr;i++)
{
if(a[i].op==2) ans[a[i].id]=l;
}
return;
}
for(int i=ql;i<=qr;i++)
{
if(a[i].op==1)
{
if(a[i].c>mid)
{
b2[++k2]=a[i];
update(1,a[i].x,a[i].y,1);
}
else b1[++k1]=a[i];
}
else
{
cnt=query(1,a[i].x,a[i].y);
if(cnt>=a[i].c) b2[++k2]=a[i];
else a[i].c-=cnt,b1[++k1]=a[i];
}
}
for(int i=1;i<=k1;i++)
{
if(a[i].op==1) update(1,a[i].x,a[i].y,-1);
}
for(int i=ql,j=1;j<=k1;i++,j++) a[i]=b1[j];
for(int i=ql+k1,j=1;j<=k2;i++,j++) a[i]=b2[j];
whole_binary_find(l,mid,ql,ql+k1-1);
whole_binary_find(mid+1,r,ql+k1,qr);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
a[i].id=i;
scanf("%d%d%d%lld",&a[i].op,&a[i].x,&a[i].y,&a[i].c);
if(a[i].op==1) ma=max(ma,a[i].c),mi=min(mi,a[i].c);
}
build(1,1,n);
whole_binary_find(mi,ma,1,m);
for(int i=1;i<=m;i++)
{
if(ans[i]) printf("%d\n",ans[i]);
}
return 0;
}