#include <bits/stdc++.h>
using namespace std;
const int maxm = 20;
pair<int, int> f[1 << maxm], g[1 << maxm];
int mp[1 << maxm];
void update(int mask, pair<int, int> val){
if(val.second == -1 || val.second == f[mask].second) return;
if(val.first > f[mask].first){
g[mask] = f[mask];
f[mask] = val;
}else g[mask] = max(g[mask], val);
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m; cin >> n >> m;
vector<int> a(n + 1), rev(n + 1), cnt(m + 1);
for(int i = 1; i <= n; i++){
for(int j = 0; j < m; j++){
int x; cin >> x;
cnt[j] += x;
a[i] |= (x << j);
}
rev[i] = a[i] ^ ((1 << m) - 1);
mp[rev[i]]++;
}
for(int mask = 0; mask < (1 << m); mask++){
if(mp[mask]) f[mask] = {__builtin_popcount(mask), mask};
else f[mask] = {-1, -1};
g[mask] = {-1, -1};
}
for(int j = 0; j < m; j++){
for(int mask = (1 << m) - 1; mask >= 0; mask--){
if(!(mask & (1 << j))){
pair<int, int> val1 = f[mask | (1 << j)], val2 = g[mask | (1 << j)];
val1.first--; val2.first--;
update(mask, val1);
update(mask, val2);
}
}
}
for(int j = 0; j < m; j++){
for(int mask = 0; mask < (1 << m); mask++){
if(mask & (1 << j)){
update(mask, f[mask ^ (1 << j)]);
update(mask, g[mask ^ (1 << j)]);
}
}
}
for(int i = 1; i <= n; i++){
int res = 0, mask = 0;
for(int j = 0; j < m; j++){
int left = cnt[j] - ((a[i] >> j) & 1);
if(left > n / 2) res++;
else if(left == n / 2) mask |= (1 << j);
}
pair<int, int> best = (f[mask].second == rev[i] && mp[rev[i]] == 1 ? g[mask] : f[mask]);
cout << res + (best.second != -1 ? best.first : 0) << "\n";
}
}