#include<cstdio>
const int maxn=50010;
int n,m;
namespace segt1{
struct node{
int ls,rs,l,r;
long long cnt,la;
node(){ls=rs=cnt=0;}
}t[maxn<<7];
int tp;
void pushup(int k){
t[k].cnt=0;
if(t[k].ls){
t[k].cnt+=t[t[k].ls].cnt;
}
if(t[k].rs){
t[k].cnt+=t[t[k].rs].cnt;
}
}
void pushdown(int k){
const int mid=(t[k].l+t[k].r)>>1;
if(!t[k].ls){
t[k].ls=++tp;
t[t[k].ls].l=t[k].l;
t[t[k].ls].r=mid;
}
if(!t[k].rs){
t[k].rs=++tp;
t[t[k].rs].r=t[k].r;
t[t[k].rs].l=mid+1;
}
t[t[k].ls].cnt+=t[k].la*(t[t[k].ls].r-t[t[k].ls].l+1);
t[t[k].rs].cnt+=t[k].la*(t[t[k].rs].r-t[t[k].rs].l+1);
t[t[k].ls].la+=t[k].la;
t[t[k].rs].la+=t[k].la;
t[k].la=0;
}
void update(int l,int r,int& k,int L=1,int R=n){
if(!k){
k=++tp;t[k].l=L,t[k].r=R;
}
if(l<=L&&r>=R){
t[k].cnt+=(t[k].r-t[k].l+1);
t[k].la++;
return;
}
pushdown(k);
const int mid=(L+R)>>1;
if(l>mid){
update(l,r,t[k].rs,mid+1,R);
}else if(r<=mid){
update(l,r,t[k].ls,L,mid);
}else{
update(l,r,t[k].rs,mid+1,R);
update(l,r,t[k].ls,L,mid);
}
pushup(k);
}
long long query(int l,int r,int k,int L=1,int R=n){
if(l>R||r<L||!k){
return 0;
}
if(l<=L&&r>=R){
return t[k].cnt;
}
pushdown(k);
const int mid=(L+R)>>1;
long long ans=query(l,r,t[k].ls,L,mid)+query(l,r,t[k].rs,mid+1,R);
return ans;
}
}
namespace segt2{
struct node{
int rt,ls,rs;
node(){rt=ls=rs=0;}
}t[maxn<<5];
int tp=0,rt;
void update(int p,int l,int r,int& k=rt,int L=1,int R=n){
if(!k){
k=++tp;
}
if(p>R||p<L){
return;
}
segt1::update(l,r,t[k].rt);
if(L==R){
return;
}else{
const int mid=(L+R)>>1;
update(p,l,r,t[k].ls,L,mid);
update(p,l,r,t[k].rs,mid+1,R);
}
}
int query(long long rnk,int l,int r,int&k=rt,int L=1,int R=n){
if(!k){
k=++tp;
t[k].rt=++segt1::tp;
}
if(rnk>segt1::query(l,r,t[k].rt)){
return -1;
}
if(L==R){
return L;
}
const int mid=(L+R)>>1;
int lrnk=segt1::query(l,r,t[t[k].rs].rt);
if(rnk>lrnk){
return query(rnk-lrnk,l,r,t[k].ls,L,mid);
}else{
return query(rnk,l,r,t[k].rs,mid+1,R);
}
}
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
int op,l,r,c;
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op==1){
segt2::update(c,1,l,r);
}else{
printf("%d\n",segt2::query(c,l,r));
}
}
return 0;
}