#include<bits/stdc++.h>
using namespace std;
int n,t;
struct node{
int ans,lsum,rsum,laz,len;
}tree[200010];
void build(int o,int l,int r){
tree[o].laz=0;
tree[o].len=r-l+1;
tree[o].lsum=tree[o].rsum=tree[o].ans=tree[o].len;
if(l==r)return;
int mid=(l+r)>>1;
build(o*2,l,mid);
build(o*2+1,mid+1,r);
}
void pushdown(int o){
if(tree[o].laz==0)return;
if(tree[o].laz==1){
tree[o*2].laz=tree[o*2+1].laz=1;
tree[o*2].lsum=tree[o*2].rsum=tree[o*2].ans=0;
tree[o*2+1].lsum=tree[o*2+1].rsum=tree[o*2+1].ans=0;
}
else{
tree[o*2].laz=tree[o*2+1].laz=2;
tree[o*2].lsum=tree[o*2].rsum=tree[o*2].ans=tree[o*2].len;
tree[o*2+1].lsum=tree[o*2+1].rsum=tree[o*2+1].ans=tree[o*2+1].len;
}
tree[o].laz=0;
}
int query(int o,int l,int r,int x){
pushdown(o);
if(l==r)return l;
int mid=(l+r)>>1;
if(tree[o*2].ans>=x)return query(o*2,l,mid,x);
else if(tree[o*2].rsum+tree[o*2+1].lsum>=x)return mid-tree[o*2].rsum+1;
else return query(o*2+1,mid+1,r,x);
}
void pushup(int o){
tree[o].ans=max(tree[o*2].ans,max(tree[o*2+1].ans,tree[o*2].rsum+tree[o*2+1].lsum));
if(tree[o*2].lsum==tree[o*2].len)tree[o].lsum=tree[o*2].len+tree[o*2+1].lsum;
else tree[o].lsum=tree[o*2].lsum;
if(tree[o*2+1].rsum==tree[o*2+1].rsum)tree[o].rsum=tree[o*2].rsum+tree[o*2+1].len;
else tree[o].rsum=tree[o*2+1].rsum;
}
void change(int o,int l,int r,int L,int R,int op){
pushdown(o);
if(L<=l&&r<=R){
if(op==1)tree[o].ans=tree[o].lsum=tree[o].rsum=0;
else tree[o].ans=tree[o].lsum=tree[o].rsum=tree[o].len;
tree[o].laz=op;
return;
}
int mid=(l+r)>>1;
if(L<=mid)change(o*2,l,mid,L,R,op);
if(R>mid)change(o*2+1,mid+1,r,L,R,op);
pushup(o);
}
int main(){
scanf("%d%d",&n,&t);
build(1,1,n);
while(t--){
int op,l,r,x;
scanf("%d",&op);
if(op==1){
scanf("%d",&x);
if(x>tree[1].ans)puts("0");
else{
int ans=query(1,1,n,x);
printf("%d\n",ans);
change(1,1,n,ans,ans+x-1,1);
}
}
else{
scanf("%d%d",&l,&r);
change(1,1,n,l,r,2);
}
}
return 0;
}