#pragma GCC optimize("O3,inline")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
using ii = pair<int, int>;
using iii = pair<int, ii>;
using pvii = pair<vector<int>, ii>;
constexpr int MAXN = 300000 + 5;
constexpr int INF = 1e18 + 5;
constexpr int LOG = 20;
signed main() {
ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
int N, M; cin >> N >> M;
vector<int> mask(N);
vector<int> counts(M);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
int x; cin >> x;
counts[j] += x;
mask[i] |= x << j;
}
}
vector<int> mask_cnt(1 << M);
for (int i = 0; i < N; ++i) mask_cnt[mask[i]]++;
for (int i = 0; i < N; ++i) mask_cnt[mask[i]] = min(mask_cnt[mask[i]], 2ll);
vector<int> augmented;
for (int i = 0; i < (1 << M); ++i) {
for (int j = 0; j < mask_cnt[i]; ++j) {
augmented.emplace_back(i);
}
}
vector<int> mask_ans(1 << M);
for (int i = 0; i < augmented.size(); ++i) {
int antimask = 0;
for (int m = 0; m < M; ++m) {
if (counts[m] - ((augmented[i] >> m) & 1) == N / 2) antimask |= 1 << m;
}
int best_idx = !i;
for (int j = 0; j < augmented.size(); ++j) {
if (i == j) continue;
if (__builtin_popcountll(~augmented[j] & antimask) > __builtin_popcountll(~augmented[best_idx] & antimask)) {
best_idx = j;
}
}
int ans = 0;
for (int m = 0; m < M; ++m) {
if (counts[m] - ((augmented[i] >> m) & 1) - ((augmented[best_idx] >> m) & 1) >= N / 2) ans++;
}
mask_ans[augmented[i]] = ans;
}
for (int i = 0; i < N; ++i) {
cout << mask_ans[mask[i]] << '\n';
}
}