#include<iostream>
using namespace std;
int n,m;
struct SegTree{
#define mid ((l+r)>>1)
struct Node{
int lran,rran,maxran,len;
}nod[50005<<2];
int t[50005<<2];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
void build(int x,int l,int r){
nod[x].len=nod[x].lran=nod[x].rran=nod[x].maxran=r-l+1;
t[x]=2;
if(r==l)return;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
}
void update(int x,int l,int r){
nod[x].maxran=max(max(nod[ls(x)].maxran,nod[rs(x)].maxran),nod[ls(x)].rran+nod[rs(x)].lran);
nod[x].lran=nod[ls(x)].lran+((nod[ls(x)].maxran==(nod[ls(x)].len))?nod[rs(x)].lran:0);
nod[x].rran=nod[rs(x)].rran+((nod[rs(x)].maxran==(nod[rs(x)].len))?nod[ls(x)].rran:0);
}
void modi(int x,int l,int r,int k){
if(k==0){
t[x]=0;
nod[x].lran=nod[x].rran=nod[x].maxran=r-l+1;
}
else if(k==1){
t[x]=1;
nod[x].lran=nod[x].rran=nod[x].maxran=0;
}
}
void push_down(int x,int l,int r){
if(t[x]!=2){
modi(ls(x),l,mid,t[x]);
modi(rs(x),mid+1,r,t[x]);
t[x]=2;
}
}
void modify(int x,int l,int r,int ml,int mr,int k){
if(ml<=l&&r<=mr){
modi(x,l,r,k);
return;
}
push_down(x,l,r);
if(ml<=mid)modify(ls(x),l,mid,ml,mr,k);
if(mr>mid)modify(rs(x),mid+1,r,ml,mr,k);
update(x,l,r);
}
int query(int x,int l,int r,int len){
if(len>nod[x].maxran)return 0;
if(l==r)return l;
push_down(x,l,r);
if(nod[ls(x)].maxran>=len)return query(ls(x),l,mid,len);
if(nod[ls(x)].rran+nod[rs(x)].lran>=len) return mid-nod[ls(x)].rran+1;
if(nod[rs(x)].maxran>=len)return query(rs(x),mid+1,r,len);
return 0;
}
}T;
int ru(int len){
int t=T.query(1,1,n,len);
if(t!=0)T.modify(1,1,n,t,t+len-1,1);
return t;
}
int chu(int l,int len){
T.modify(1,1,n,l,l+len-1,0);
}
int main(){
cin>>n>>m;
T.build(1,1,n);
for(int i=1;i<=m;i++){
int opt;
cin>>opt;
if(opt==1){
int x;
cin>>x;
cout<<ru(x)<<"\n";
}
else {
int l,r;
cin>>l>>r;
chu(l,r);
}
}
return 0;
}