马蜂清奇,见谅
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
int n,m,f[500005],tot;
ll ans[500005],v[500005];
struct node{
int op,l,r,id;
ll c;
}o[500005],o2[500005],o3[500005];
bool cmp(int x,int y){ return x>y; }
int tr[2000005],lz[2000005];
void change(int ct,int l,int r,int ml,int mr,int val){
if(l>r||ml>mr) return;
if(l>=ml&&r<=mr){
tr[ct]+=(r-l+1)*val,lz[ct]+=val;
return;
}
int mid=(l+r)>>1;
if(ml<=mid) change(ct<<1,l,mid,ml,mr,val);
if(mr>=mid+1) change(ct<<1|1,mid+1,r,ml,mr,val);
tr[ct]=tr[ct<<1]+tr[ct<<1|1];
}
int ask(int ct,int l,int r,int ml,int mr){
if(l>r||ml>mr) return 0;
if(l>=ml&&r<=mr) return tr[ct];
int rt=0;
int mid=(l+r)>>1;
if(lz[ct]!=0){
tr[ct<<1]+=(mid-l+1)*lz[ct],tr[ct<<1|1]+=(r-mid)*lz[ct];
lz[ct<<1]+=lz[ct],lz[ct<<1|1]+=lz[ct];
lz[ct]=0;
}
if(ml<=mid) rt+=ask(ct<<1,l,mid,ml,mr);
if(mr>=mid+1) rt+=ask(ct<<1|1,mid+1,r,ml,mr);
tr[ct]=tr[ct<<1]+tr[ct<<1|1];
return rt;
}
void work(int l1,int r1,int l2,int r2){
if(l1>r1||l2>r2) return;
int mid=(l2+r2)>>1,cnt1=0,cnt2=0;
for(int i=l1;i<=r1;i++){
if(o[i].op==1){
if(o[i].c>=v[mid]) change(1,1,n,o[i].l,o[i].r,1),o2[++cnt1]=o[i];
else o3[++cnt2]=o[i];
}else{
if(ask(1,1,n,o[i].l,o[i].r)>=o[i].c) o2[++cnt1]=o[i];
else o[i].c-=ask(1,1,n,o[i].l,o[i].r),o3[++cnt2]=o[i];
}
}
int ct=0;
for(int i=l1;i<l1+cnt1;i++) o[i]=o2[++ct];
ct=0;
for(int i=l1+cnt1;i<=r1;i++) o[i]=o3[++ct];
for(int i=l1;i<l1+cnt1;i++) if(o[i].op==1) change(1,1,n,o[i].l,o[i].r,-1);
for(int i=l1;i<l1+cnt1;i++) if(o[i].op==2) ans[o[i].id]=v[mid];
work(l1+cnt1,r1,mid+1,r2);
work(l1,l1+cnt1-1,l2,mid-1);
}
bool cmp2(node x,node y){ return x.id<y.id; }
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld%lld",&o[i].op,&o[i].l,&o[i].r,&o[i].c);
if(o[i].op==1) v[++v[0]]=o[i].c;
o[i].id=i;
}
sort(v+1,v+v[0]+1,cmp);
for(int i=1;i<=v[0];i++) if(i==1||v[i]!=v[tot]) v[++tot]=v[i];
work(1,m,1,tot);
sort(o+1,o+m+1,cmp2);
for(int i=1;i<=m;i++) if(o[i].op==2) printf("%lld\n",ans[i]);
}