只对了 #10 #12
#include<bits/stdc++.h>
#define inf 1000000000005
#define int long long
#define N 10000006
#define ls (now<<1)
#define rs (now<<1|1)
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,ans[N];
struct node
{
int op,l,r,c,id;
}s;
vector<node> v;
struct tree
{
int tag,val;
}tr[N];
int lowbit(int x){return x&(-x);}
void up(int now){tr[now].val=tr[ls].val+tr[rs].val;}
void down(int now)
{
if(tr[now].tag!=0)
{
tr[ls].val+=tr[now].tag;
tr[rs].val+=tr[now].tag;
tr[ls].tag+=tr[now].tag;
tr[rs].tag+=tr[now].tag;
tr[now].tag=0;
}
}
void add(int now,int l,int r,int ql,int qr,int val)
{
if(l>=ql&&r<=qr)
{
tr[now].val+=val*(r-l+1);
tr[now].tag+=val;
return ;
}
down(now);
int mid=(l+r)>>1;
if(mid>=ql)add(ls,l,mid,ql,qr,val);
if(mid<qr)add(rs,mid+1,r,ql,qr,val);
up(now);
}
int que(int now,int l,int r,int ql,int qr)
{
if(l>=ql&&r<=qr)return tr[now].val;
down(now);
int mid=(l+r)>>1,cnt=0;
if(mid>=ql)cnt+=que(ls,l,mid,ql,qr);
if(mid<qr)cnt+=que(rs,mid+1,r,ql,qr);
return cnt;
}
void solve(int l,int r,vector<node> v)
{
if(l>r)return ;
if(v.size()==0)return ;
if(l==r)
{
for(int i=0,con=v.size();i<con;i++)
if(v[i].op==2)ans[v[i].id]=l;
return ;
}
vector<node> v1,v2;
int t1=0,t2=0,mid=(l+r)/2;
if(mid<0)mid-=1;
for(int i=0,con=v.size();i<con;i++)
{
if(v[i].op==1)
{
if(v[i].c>mid)
{
add(1,1,n,v[i].l,v[i].r,1);
v2.push_back(v[i]);
}
else v1.push_back(v[i]);
}
else
{
int res=que(1,1,n,v[i].l,v[i].r);
if(v[i].c<=res)v2.push_back(v[i]),t2++;
else
{
v[i].c-=res;t1++;
v1.push_back(v[i]);
}
}
}
for(int i=0,con=v.size();i<con;i++)
{
if(v[i].op==1&&v[i].c>mid)
add(1,1,n,v[i].l,v[i].r,-1);
}
if(t1)solve(l,mid,v1);
if(t2)solve(mid+1,r,v2);
}
signed main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
{
s.op=read();s.l=read();s.r=read();s.c=read();
s.id=i;
v.push_back(s);
}
solve(-n,n,v);
for(int i=1;i<=m;i++)
if(ans[i])cout<<ans[i]<<"\n";
return 0;
}