#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const double PI = acos(-1.0);
const int MAXN = 1e5 + 5;
const int MAXM = 2e6 + 5;
const int MOD = 1e9 + 7;
int sgn(double x) {
  if (fabs(x) < eps) return 0;
  if (x < 0)
    return -1;
  else
    return 1;
}
long long pw(long long a, long long n, long long mod) {
  long long ret = 1;
  while (n) {
    if (n & 1) ret = ret * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return ret;
}
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
void inc(long long &a, long long b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
void dec(long long &a, long long b) {
  a -= b;
  if (a < 0) a += MOD;
}
int mul(int a, int b) {
  long long c = 1ll * a * b;
  return c - c / MOD * MOD;
}
int n, k;
struct Node {
  int mx[15], mi[15], sz;
  bool operator<(const Node &b) const {
    for (int i = 0; i < k; i++)
      if (mx[i] > b.mi[i]) return false;
    return true;
  }
} t;
set<Node> S;
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n + 1; i++) {
    for (int j = 0; j < k; j++) scanf("%d", &t.mi[j]), t.mx[j] = t.mi[j];
    t.sz = 1;
    auto l = S.lower_bound(t);
    auto r = S.upper_bound(t);
    while (l != r) {
      t.sz += (*l).sz;
      for (int j = 0; j < k; j++) {
        t.mi[j] = min(t.mi[j], (*l).mi[j]);
        t.mx[j] = max(t.mx[j], (*l).mx[j]);
      }
      S.erase(l++);
    }
    S.insert(t);
    printf("%d\n", S.rbegin()->sz);
  }
}
