#include <bits/stdc++.h>
using namespace std;
int maska[300007];
int tab[300007][21];
int ile[27];
int dp11[1048580];
int dp12[1048580];
int dp21[1048580];
int dp22[1048580];
struct wartosc 
{
    int j1, j2;
    wartosc(int a=-1, int b=-1): j1(a), j2(b) {}
};
wartosc dop[1048580];
void dodaj(wartosc &p, int gdzie)
{
	if (gdzie == -1)
	{
		return;
	}
    else if (p.j1 == gdzie || p.j2 == gdzie)
    {
    	return;
    }
    else if (p.j1 == -1) 
    {
    	p.j1 = gdzie;
    	return;
    }
    else if (p.j2 == -1) 
    {
    	p.j2 = gdzie; 
    	return;
    }
}
void dodaj2(int maskaa, int gdzie, int k)
{
        if (gdzie == -1)
        {
        	return;
        }
        else if (dp21[maskaa] == gdzie)
        {
            if (k > dp11[maskaa])
            {
            	dp11[maskaa] = k;
            }
            return;
        }
        else if (dp22[maskaa] == gdzie)
        {
            if (k > dp12[maskaa])
            {
            	dp12[maskaa] = k;
            }
            return;
        }
        else if (dp21[maskaa] == -1 || k > dp11[maskaa]) 
        {
            if (dp21[maskaa] != -1) 
            {
                dp22[maskaa] = dp21[maskaa];
                dp12[maskaa] = dp11[maskaa];
            }
            dp21[maskaa] = gdzie;
            dp11[maskaa] = k;
        } 
        else if (dp22[maskaa] == -1 || k > dp12[maskaa]) 
        {
            dp22[maskaa] = gdzie;
            dp12[maskaa] = k;
        }
}
int main() 
{
	for(int i = 0; i < 1048577; i++)
	{
		dp11[i] = -1;
		dp12[i] = -1;
		dp21[i] = -1;
		dp22[i] = -1;
	}
	int n, m, wym;
	cin >> n >> m;
	wym = n / 2;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
		{
			cin >> tab[i][j];
			maska[i] += (tab[i][j] << j);
			ile[j] += tab[i][j];
		}
		dodaj(dop[(1 << m) - 1 - maska[i]], i);
	}
	for (int i = 0; i < m ; i++)
	{
        for (int maskaa = 0; maskaa < (1 << m); maskaa++)
        {
            if ((maskaa & (1<<i)) == 0)
            {
                dodaj(dop[maskaa], dop[maskaa | (1<<i)].j1);
                dodaj(dop[maskaa], dop[maskaa | (1<<i)].j2);
            }
        }
    }
    for (int i = 0; i < (1 << m); i++) 
    {
        if (dop[i].j1 != -1)
        {
        	dodaj2(i, dop[i].j1, __builtin_popcount(i));
        }
        if (dop[i].j2 != -1)
        {
        	dodaj2(i, dop[i].j2, __builtin_popcount(i));
        }
    }
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < (1 << m); ++j) 
        {
            if (j & (1 << i)) 
            {
                if (dp21[j ^ (1<<i)] != -1)
                {
                	dodaj2(j, dp21[j ^ (1<<i)], dp11[j ^ (1<<i)]);
                }
                if (dp22[j ^ (1<<i)] != -1)
                {
                	dodaj2(j, dp22[j ^ (1<<i)], dp12[j ^ (1<<i)]);
                }
            }
        }
    }
	for(int i = 0; i < n; i++)
	{
		int odp = 0, maskac = 0;
		for(int j = 0; j < m; j++)
		{
			ile[j] -= tab[i][j];
			if(ile[j] == wym)
			{
				maskac += 1 << j;
			}
			else if(ile[j] > wym)
			{
				odp++;
			}
		}
		if(dp21[maskac] != i)
		{
			odp += dp11[maskac];
		}
		else
		{
			odp += dp12[maskac];	
		}
		for(int j = 0; j < m; j++)
		{
			ile[j] += tab[i][j];
		}
		cout << odp << 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... |