#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 5e4 + 10;
inline int du(void) {
int x = 0, f = 1;
char ch = getchar();
while (ch > '9' || ch < '0') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
inline void write(int x) {
if (x < 0) { putchar('-'); x = -x; }
if (x > 9)write(x / 10);
putchar(x % 10 ^ 48);
return;
}
int n, m;
int L[N << 2], R[N << 2];
int siz[N << 2], Max[N << 2], Lmax[N << 2], sum[N << 2], Rmax[N << 2];
int tag[N << 2], ans[N];
inline void push_up(int k) {
siz[k] = siz[k << 1] + siz[k << 1 | 1];
R[k] = R[k << 1 | 1], L[k] = L[k << 1 | 1];//容易遗漏
Lmax[k] = Lmax[k << 1], Rmax[k] = Rmax[k << 1 | 1], Max[k] = max(Max[k << 1], Max[k << 1 | 1]);
if (R[k << 1] == L[k << 1 | 1] && R[k << 1] == 1) {
Max[k] = max(Max[k], Rmax[k << 1] + Lmax[k << 1 | 1]);
if (siz[k << 1] == Max[k << 1])Lmax[k] = siz[k << 1] + Lmax[k << 1 | 1];
if (siz[k << 1 | 1] == Max[k << 1 | 1])Rmax[k] = siz[k << 1 | 1] + Rmax[k << 1];
}
Max[k] = max(Max[k], max(Lmax[k], Rmax[k]));
return;
}
inline void build(int k, int l, int r) {
if (l == r) {
R[k] = L[k] = 1;
siz[k] = Max[k] = Lmax[k] = Rmax[k] = 1;
return;
}
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
push_up(k);
return;
}
//1清空2住人
inline void Add(int k, int l, int r, int v) {
tag[k] = v;
L[k] = R[k] = v;
Lmax[k] = tag[k] == 1 ? (r - l + 1) : 0;
Rmax[k] = tag[k] == 1 ? (r - l + 1) : 0;
Max[k] = tag[k] == 1 ? (r - l + 1) : 0;
return;
}
inline void pushdown(int k, int l, int r) {
if (tag[k] == 0)
return;
int mid = (l + r) >> 1;
Add(k << 1, l, mid, tag[k]);
Add(k << 1 | 1, mid + 1, r, tag[k]);
tag[k] = 0;
return;
}
inline void update(int k, int l, int r, int ql, int qr, int v) {
if (ql <= l && r <= qr) {
Add(k, l, r, v);
return;
}
pushdown(k, l, r);
int mid = (l + r) >> 1;
if (ql <= mid)update(k << 1, l, mid, ql, qr, v);
if (qr > mid)update(k << 1 | 1, mid + 1, r, ql, qr, v);
push_up(k);
return;
}
inline int query(int k, int l, int r, int x) {
int mid = (l + r) >> 1;
pushdown(k, l, r);
if (Max[k << 1] >= x)return query(k << 1, l, mid, x);
else if (Rmax[k << 1] + Lmax[k << 1 | 1] >= x)return siz[k << 1] - Rmax[k << 1] + 1;
else if(Max[k << 1 | 1] >= x)return query(k << 1 | 1, mid + 1, r, x);
}
int main(void) {
n = du(), m = du();
int ins, x, y;
build(1, 1, n);
//cout << Max[1];
int cnt = 0;
for (int i = 1; i <= m; ++i) {
ins = du();
if (ins == 1) {
x = du();
if (Max[1] < x)
ans[++cnt] = 0;
else {
int l = query(1, 1, n, x);
ans[++cnt] = l;
update(1, 1, n, l, l + x - 1, 2);
}
}
if (ins == 2) {
x = du(), y = du();
update(1, 1, n, x, x + y - 1, 1);
}
}
for (int i = 1; i <= cnt; ++i)
cout << ans[i] << endl;
return 0;
}