#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 3e5 + 5;
const int M = 20;
int n, m;
struct Save
{
    int mx1, pos1;
    int mx2, pos2;
};
bool vote[N][M];
int cnt[M];
Save dp[(1 << M)];
constexpr Save upd(const Save &a, const Save &b)
{
    Save ret{0, 0, 0, 0};
    ret.mx1 = max(a.mx1, b.mx1);
    if (ret.mx1 == a.mx1)
    {
        ret.pos1 = a.pos1;
    }
    else
    {
        ret.pos1 = b.pos1;
    }
    if (a.mx1 > ret.mx2 && a.pos1 != ret.pos1)
    {
        ret.mx2 = a.mx1;
        ret.pos2 = a.pos1;
    }
    if (b.mx1 > ret.mx2 && b.pos1 != ret.pos1)
    {
        ret.mx2 = b.mx1;
        ret.pos2 = b.pos1;
    }
    if (a.mx2 > ret.mx2 && a.pos2 != ret.pos1)
    {
        ret.mx2 = a.mx2;
        ret.pos2 = a.pos2;
    }
    if (b.mx2 > ret.mx2 && b.pos2 != ret.pos1)
    {
        ret.mx2 = b.mx2;
        ret.pos2 = b.pos2;
    }
    return ret;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        int mask = 0;
        for (int q = 0; q < m; q++)
        {
            cin >> vote[i][q];
            if (!vote[i][q])
            {
                mask += (1 << q);
            }
            else
            {
                cnt[q]++;
            }
        }
        for (int submask = mask; submask > 0; submask = (submask - 1) & mask)
        {
            dp[submask] = upd(dp[submask], Save{__builtin_popcount(submask), i, 0, 0});
        }
        dp[0] = upd(dp[0], Save{0, i, 0, 0});
    }
    for (int i = 0; i < m; i++)
    {
        for (int mask = (1 << i); mask < (1 << m); mask = (mask + 1) | (1 << i))
        {
            dp[mask] = upd(dp[mask], dp[mask ^ (1 << i)]);
        }
    }
    for (int i = 0; i < n; i++)
    {
        int good = 0, mask = 0;
        for (int q = 0; q < m; q++)
        {
            int rem = cnt[q] - vote[i][q];
            if (rem > n / 2)
            {
                good++;
            }
            if (rem == n / 2)
            {
                mask |= (1 << q);
            }
        }
        int ans = good;
        if (dp[mask].pos1 == i)
        {
            ans += dp[mask].mx2;
        }
        else
        {
            ans += dp[mask].mx1;
        }
        cout << ans << endl;
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |