#include<bits/stdc++.h>
using namespace std;
const int N=50005;
int n,m;
struct Node {int lmax,rmax,max,len;};
Node merge(Node a,Node b) {
Node c;
if(a.len==a.max) c.lmax=a.max+b.lmax;
else c.lmax=a.lmax;
if(b.len==b.max) c.rmax=a.rmax+b.max;
else c.rmax=b.rmax;
c.max=max({c.lmax,c.rmax,a.max,b.max,a.rmax+b.lmax});
c.len=a.len+b.len;
return c;
}
struct Tre {
int l,r;
Node node;
int tag;
}tre[4*N];
#define mid (tre[now].l+tre[now].r>>1)
#define lson (now*2)
#define rson (now*2+1)
void clear(int now,int tag) {
int siz=tre[now].r-tre[now].l+1;
if(tag==1) tre[now].node={siz,siz,siz,siz};
else if(tag==2) tre[now].node={0,0,0,siz};
}
void pushdown(int now) {
if(tre[now].tag) {
clear(now,tre[now].tag);
if(tre[now].l!=tre[now].r) tre[lson].tag=tre[rson].tag=tre[now].tag;
tre[now].tag=0;
}
}
void pushup(int now) {
pushdown(now);
if(tre[now].l==tre[now].r) return;
pushdown(lson);pushdown(rson);
tre[now].node=merge(tre[lson].node,tre[rson].node);
}
void build(int now,int l,int r) {
tre[now].l=l,tre[now].r=r;
clear(now,1);
if(l==r) return;
build(lson,l,mid);build(rson,mid+1,r);
}
int query(int now,int x) {
pushdown(now);
if(tre[now].l==tre[now].r) return tre[now].l;
if(tre[lson].node.max>=x) return query(lson,x);
else if(tre[lson].node.rmax+tre[rson].node.lmax>=x) return mid-tre[lson].node.rmax+1;
else return query(rson,x);
}
void change(int now,int l,int r,int op) {
if(tre[now].l>r || tre[now].r<l) return;
pushdown(now);
if(tre[now].l>=l && tre[now].r<=r) {tre[now].tag=op;return;}
change(lson,l,r,op);change(rson,l,r,op);
pushup(now);
}
int main() {
cin >> n >> m;
build(1,1,n);
int op,x,l,r;
for(int i=1;i<=m;++i) {
cin >> op;
if(op==1) {
cin >> x;
if(tre[1].node.max>=x) {
int ans=query(1,x);
cout << ans << endl;
change(1,ans,ans+x-1,2);
}else cout << 0 << endl;
}else {
cin >> l >> r;
change(1,l,l+r-1,1);
}
}
return 0;
}