#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define st first
#define nd second
#define pb push_back    
const int maxn = 3e5+7;
struct opt{
    int maks1;
    int maks2;
    int ind1;
    int ind2;
};
int glosowanie[maxn];
int ustawa[maxn];
opt dp[1024*1024+7];
int wyniki[maxn];
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,m;
    cin>>n>>m;
    int liczba,x,zapalone;
    opt akt;
    for(int i=0;i<(1<<m);i++){
        dp[i].maks1 = 0;
        dp[i].maks2 = 0;
        dp[i].ind1 = 0;
        dp[i].ind2 = 0;
    }
    for(int i=1;i<=n;i++){
        liczba = 0;
        zapalone = 0;
        for(int j=m-1;j>=0;j--){
            cin>>x;
            if(x == 1){
                liczba += (1<<j);
                ustawa[j]++;
                zapalone++;
            }
        }
        glosowanie[i] = liczba;
        if(dp[liczba^((1<<m)-1)].maks1 != 0){
            dp[liczba^((1<<m)-1)].maks2 = m-zapalone;
            dp[liczba^((1<<m)-1)].ind2 = i;
        }
        else{
            akt.maks1 = m-zapalone;
            akt.ind1 = i;
            akt.maks2 = 0;
            akt.ind2 = 0;     
            dp[liczba^((1<<m)-1)] = akt;
        }
    }
    for(int i=(1<<m)-1;i>=1;i--){
        for(int j=m-1;j>=0;j--){
            if(i&(1<<j)){
                akt = dp[i];
                akt.maks1 = max((int)0,akt.maks1-1);
                akt.maks2 = max((int)0,akt.maks2-1);
                if(akt.maks1 > dp[i^(1<<j)].maks1){
                    if(akt.maks2 > dp[i^(1<<j)].maks2){
                        dp[i^(1<<j)].maks1 = akt.maks1;
                        dp[i^(1<<j)].ind1 = akt.ind1;
                        dp[i^(1<<j)].maks2 = akt.maks2;
                        dp[i^(1<<j)].ind2 = akt.ind2;
                    }
                    else if(akt.ind1 != dp[i^(1<<j)].ind1){
                        dp[i^(1<<j)].maks2 = dp[i^(1<<j)].maks1;
                        dp[i^(1<<j)].ind2 = dp[i^(1<<j)].ind1;
                        dp[i^(1<<j)].maks1 = akt.maks1;
                        dp[i^(1<<j)].ind1 = akt.ind1;
                    }
                    else if(akt.ind1 != dp[i^(1<<j)].ind2){
                        dp[i^(1<<j)].maks1 = akt.maks1;
                        dp[i^(1<<j)].ind1 = akt.ind1;
                    }
                }
                else if(akt.maks1 > dp[i^(1<<j)].maks2 && akt.ind1 != dp[i^(1<<j)].ind1){
                    dp[i^(1<<j)].maks2 = akt.maks1;
                    dp[i^(1<<j)].ind2 = akt.ind1;
                }
                else if(akt.maks2 > dp[i^(1<<j)].maks2 && akt.ind2 != dp[i^(1<<j)].ind1){
                    dp[i^(1<<j)].maks2 = akt.maks2;
                    dp[i^(1<<j)].ind2 = akt.ind2;
                }
            }
        }
    }
    for(int i=1;i<(1<<m);i++){
        for(int j=m-1;j>=0;j--){
            if(i&(1<<j)){
                akt = dp[i^(1<<j)];
                if(akt.maks1 > dp[i].maks1){
                    if(akt.maks2 > dp[i].maks2){
                        dp[i].maks1 = akt.maks1;
                        dp[i].ind1 = akt.ind1;
                        dp[i].maks2 = akt.maks2;
                        dp[i].ind2 = akt.ind2;
                    }
                    else if(akt.ind1 != dp[i].ind1){
                        dp[i].maks2 = dp[i].maks1;
                        dp[i].ind2 = dp[i].ind1;
                        dp[i].maks1 = akt.maks1;
                        dp[i].ind1 = akt.ind1;
                    }
                    else if(akt.ind1 != dp[i].ind2){
                        dp[i].maks1 = akt.maks1;
                        dp[i].ind1 = akt.ind1;
                    }
                }
                else if(akt.maks1 > dp[i].maks2 && akt.ind1 != dp[i].ind1){
                    dp[i].maks2 = akt.maks1;
                    dp[i].ind2 = akt.ind1;
                }
                else if(akt.maks2 > dp[i].maks2 && akt.ind2 != dp[i].ind1){
                    dp[i].maks2 = akt.maks2;
                    dp[i].ind2 = akt.ind2;
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        liczba = 0;
        for(int j=m-1;j>=0;j--){
            if(glosowanie[i]&(1<<j)){
                x = ustawa[j]-1;
            }
            else{
                x = ustawa[j];
            }
            if(x*2 > n-2 && (x-1)*2 <= n-2){
                liczba += (1<<j);
            }
            else if((x-1)*2 > n-2){
                wyniki[i]++;
            }
        }
        if(dp[liczba].ind1 == i){
            wyniki[i] += dp[liczba].maks2;
        }
        else{
            wyniki[i] += dp[liczba].maks1;
        }
        
    }
    for(int i=1;i<=n;i++){
        cout<<wyniki[i]<<"\n";
    }
    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... |