#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 20, K = 11;
int seg1[4 * N], seg2[4 * N];
set<pair<int, int> > dp[N];
int res[N], h[N], n, m;
set<int> pos;
vector<int> v, foo;
bool mark[N];
void set_val(int id, int p, int vl, int s, int e, int* seg) {
  if (e - s < 2) {
    seg[id] = vl;
    return;
  }
  int mid = (s + e) / 2;
  if (p < mid)
    set_val(2 * id, p, vl, s, mid, seg);
  else
    set_val(2 * id + 1, p, vl, mid, e, seg);
  seg[id] = max(seg[2 * id], seg[2 * id + 1]);
}
int get_val(int id, int L, int R, int s, int e, int* seg) {
  if (L <= s && e <= R) return seg[id];
  if (L >= e || s >= R) return 0;
  int mid = (s + e) / 2;
  return max(get_val(2 * id, L, R, s, mid, seg),
             get_val(2 * id + 1, L, R, mid, e, seg));
}
vector<int> af, be, lis;
void get_lis(vector<int>& t) {
  lis.clear();
  int sz = (int)t.size();
  lis.resize(sz);
  for (int i = 0; i < sz; i++) lis[i] = 1;
  for (int i = sz - 1; i >= 0; i--)
    for (int j = i + 1; j < sz; j++)
      if (h[t[j]] > h[t[i]]) lis[i] = max(lis[i], lis[j] + 1);
  return;
}
void change(int p, int vl) {
  set_val(1, p, vl, 0, n, seg1);
  dp[h[p]].erase(pair<int, int>(res[p], p));
  res[p] = vl;
  dp[h[p]].insert(pair<int, int>(res[p], p));
  auto it = dp[h[p]].rbegin();
  int mx = (*it).first;
  set_val(1, h[p], mx, 0, m + K, seg2);
  return;
}
void add(int p) {
  af.clear();
  be.clear();
  int sz = v.size();
  for (int i = sz - 1; i >= max(0, sz - K); i--) {
    if (h[v[i]] >= h[p]) continue;
    if (mark[v[i]]) continue;
    if (v[i] > p)
      af.push_back(v[i]);
    else
      be.push_back(v[i]);
  }
  sort(af.begin(), af.end());
  sort(be.begin(), be.end());
  int ls = p + 1, mx = 0;
  sz = (int)af.size();
  for (int i = 0; i < sz; i++) {
    mx = max(mx, get_val(1, ls, af[i], 0, n, seg1));
    ls = af[i] + 1;
  }
  mx = max(mx, get_val(1, ls, n, 0, n, seg1));
  change(p, mx + 1);
  get_lis(be);
  sz = (int)be.size();
  for (int i = 0; i < sz; i++) {
    if (res[be[i]] < lis[i] + mx + 1) change(be[i], lis[i] + mx + 1);
  }
  return;
}
void del(int p) {
  change(p, 0);
  mark[p] = true;
  return;
}
void ins(int p) {
  mark[p] = false;
  int mx = get_val(1, h[p] + 1, m + K, 0, m + K, seg2);
  change(p, mx + 1);
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int tp;
    cin >> tp;
    if (tp == 1) {
      int p, x;
      cin >> p >> x;
      --p;
      h[p] = m - i + x;
      pos.insert(p);
      add(p);
      v.push_back(p);
    } else {
      int x;
      cin >> x;
      foo.clear();
      for (int i = 0; i < x; i++) {
        int p = *pos.begin();
        del(p);
        pos.erase(p);
        if (i < x - 1) foo.push_back(p);
      }
      while ((int)foo.size()) {
        int p = foo.back();
        foo.pop_back();
        ins(p);
        pos.insert(p);
      }
    }
    cout << seg1[1] << '\n';
  }
}
