#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, q, x, y, z, op;
const int N = 5e4 + 5;
struct Segment_Tree {
#define mid (L + R) >> 1
#define lson ls(p), L, (L + R) >> 1
#define rson rs(p), ((L + R) >> 1) + 1, R
#define son p, L, R
int ans[N << 2], len[N << 2], tag[N << 2], lmax[N << 2], rmax[N << 2];
inline int ls(int p) {return p << 1;}
inline int rs(int p) {return p << 1 | 1;}
inline void psup(int p) {
if(ans[ls(p)] == len[ls(p)]) lmax[p] = ans[ls(p)] + lmax[rs(p)];
else lmax[p] = lmax[ls(p)];
if(ans[rs(p)] == len[rs(p)]) rmax[p] = ans[rs(p)] + rmax[ls(p)];
else rmax[p] = rmax[rs(p)];
ans[p] = max({ans[ls(p)], ans[rs(p)], lmax[rs(p)] + rmax[ls(p)]});
}
inline void build(int p = 1, int L = 1, int R = n) {
ans[p] = len[p] = lmax[p] = rmax[p] = R - L + 1;
if(L == R) return;
build(lson), build(rson), psup(p);
}
inline void work1(int p) {
tag[p] = 1;
ans[p] = lmax[p] = rmax[p] = 0;
}
inline void work2(int p) {
tag[p] = 2;
ans[p] = lmax[p] = rmax[p] = len[p];
}
inline void psd(int p, int L, int R) {
if(! tag[p]) return;
else if(tag[p] == 1) work1(ls(p)), work1(rs(p));
else work2(ls(p)), work2(rs(p));
tag[p] = 0;
}
inline void add(int l, int r, int k, int p = 1, int L = 1, int R = n) {
if(l <= L && R <= r) {
if(k == 1) work1(p);
else work2(p);
return;
}
psd(son);
if(l <= mid) add(l, r, k, lson);
if(r > mid) add(l, r, k, rson);
psup(p);
}
inline int query(int k, int p = 1, int L = 1, int R = n) {
if(L == R) return L;
psd(son);
if(ans[ls(p)] >= k) return query(k, lson);
else if(rmax[ls(p)] + lmax[rs(p)] >= k) return mid - rmax[ls(p)] + 1;
else return query(k, rson);
}
} Sgt;
signed main() {
ios_base :: sync_with_stdio(NULL);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> q;
Sgt.build();
while(q --) {
cin >> op >> x;
if(op == 1) {
if(Sgt.ans[1] < x) {
cout << "0\n";
continue;
}
z = Sgt.query(x), Sgt.add(z, z + x - 1, 1), cout << z << '\n' << Sgt.ans[1] << '\n';
}
else cin >> y, Sgt.add(x, x + y - 1, 2);
}
return 0;
}