#include <bits/stdc++.h>
using namespace std;
priority_queue<pair<int, int>, vector<pair<int, int> >,
               greater<pair<int, int> > >
    Qx, Qy;
struct Tree {
  int ma[(210000 + 100) << 2];
  void Pushup(int no) { ma[no] = max(ma[no << 1], ma[no << 1 | 1]); }
  void update(int l, int r, int no, int k, int val) {
    if (l == r)
      ma[no] = val;
    else {
      int mid = (l + r) >> 1;
      if (k <= mid)
        update(l, mid, no << 1, k, val);
      else
        update(mid + 1, r, no << 1 | 1, k, val);
      Pushup(no);
    }
  }
  int query(int l, int r, int no, int st, int en) {
    if (st <= l && r <= en)
      return ma[no];
    else {
      int mid = (l + r) >> 1;
      if (en <= mid)
        return query(l, mid, no << 1, st, en);
      else if (st > mid)
        return query(mid + 1, r, no << 1 | 1, st, en);
      else
        return max(query(l, mid, no << 1, st, en),
                   query(mid + 1, r, no << 1 | 1, st, en));
    }
  }
} Tx, Ty;
int f[110000], h[110000], top;
pair<int, int> st[110000];
bool is[110000];
int main() {
  int n, m, i, j, k, op, x, y;
  scanf("%d%d", &n, &m);
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &op, &x);
    if (op == 1) {
      scanf("%d", &y);
      h[x] = y + 200000 - i;
      for (j = 1, top = 0; j <= 10 && !Qy.empty(); j++) {
        do {
          k = Qy.top().second;
          Qy.pop();
        } while (!is[k] && !Qy.empty());
        if (!is[k]) break;
        Tx.update(1, n, 1, k, 0);
        Ty.update(0, 210000, 1, h[k], 0);
        st[++top] = pair<int, int>(h[k], k);
      }
      st[++top] = pair<int, int>(h[x], x);
      sort(st + 1, st + top + 1);
      while (top) {
        k = st[top--].second;
        Qy.push(pair<int, int>(h[k], k));
        f[k] = Tx.query(1, n, 1, k, n) + 1;
        Tx.update(1, n, 1, k, f[k]);
        Ty.update(0, 210000, 1, h[k], f[k]);
      }
      Qx.push(pair<int, int>(x, x));
      is[x] = 1;
    } else {
      for (j = 1, top = 0; j <= x && !Qx.empty(); j++) {
        do {
          k = Qx.top().second;
          Qx.pop();
        } while (!is[k] && !Qx.empty());
        if (!is[k]) break;
        Tx.update(1, n, 1, k, 0);
        Ty.update(0, 210000, 1, h[k], 0);
        st[++top] = pair<int, int>(k, k);
      }
      x = k;
      top--;
      while (top) {
        k = st[top--].second;
        Qx.push(pair<int, int>(k, k));
        f[k] = Ty.query(0, 210000, 1, h[k] + 1, 210000) + 1;
        Tx.update(1, n, 1, k, f[k]);
        Ty.update(0, 210000, 1, h[k], f[k]);
      }
      is[x] = 0;
    }
    printf("%d\n", Tx.ma[1]);
  }
  return 0;
}
