#include <bits/stdc++.h>

using namespace std;

struct Cvor{
    int tok;
    Cvor* desni;
    Cvor* levi;
    Cvor* dole;
};

void teciDesno(bool** kamenje, Cvor** rezultat, int x, int y, int n){
    if(y < n - 1 && !kamenje[x][y]){
        if(y > 0 && rezultat[x][y - 1].desni != NULL){
            rezultat[x][y].desni = rezultat[x][y - 1].desni;
        }else{
            int prviPrazan = y;
            while(prviPrazan < n && !kamenje[x][prviPrazan]){
                prviPrazan++;
            }

            if(prviPrazan != n){
                rezultat[x][y].desni = &rezultat[x + 1][prviPrazan];
            }
        }
    }
}

void teciLevo(bool** kamenje, Cvor** rezultat, int x, int y, int n){
    if(y > 0 && !kamenje[x][y]){
        if(rezultat[x][y - 1].levi != NULL){
            rezultat[x][y].levi = rezultat[x][y - 1].levi;
        }else{
            int prviPrazan = y;
            while(prviPrazan >= 0 && !kamenje[x][prviPrazan]){
                prviPrazan--;
            }

            if(prviPrazan != -1){
                rezultat[x][y].levi = &rezultat[x + 1][prviPrazan];
            }
        }
    }
}

void teciDole(bool** kamenje, Cvor** rezultat, int x, int y, int n){
    if(kamenje[x][y]){
        rezultat[x][y].dole = &rezultat[x + 1][y];
    }
}

int main()
{
    int n, h;
    scanf("%d %d", &h, &n);

    bool kamenje[h][n];
    Cvor rezultat[h + 1][n];

    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            int temp;
            scanf("%d", &temp);
            kamenje[i][j] = temp;
        }
    }


    for(int i = 0; i < h + 1; i++){
        for(int j = 0; j < n; j++){
            rezultat[i][j].desni = NULL;
            rezultat[i][j].levi = NULL;
            rezultat[i][j].dole = NULL;
            rezultat[i][j].tok = 0;
        }
    }

    for(int i = 0; i < n; i++){
        rezultat[0][i].tok = 1;
    }

    Cvor* pokRez[h + 1];
    for (int i = 0; i < h + 1; ++i)
        pokRez[i] = rezultat[i];

    bool* pokKam[h];
    for (int i = 0; i < h; ++i)
        pokKam[i] = kamenje[i];

    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            teciDesno(pokKam, pokRez, i, j, n);
            teciLevo(pokKam, pokRez, i, j, n);
            teciDole(pokKam, pokRez, i, j, n);

            /*if(rezultat[i][j].desni == NULL){
                printf("d");
            }
            if(rezultat[i][j].levi == NULL){
                printf("l");
            }
            if(rezultat[i][j].dole == NULL){
                printf("dole");
            }
            printf("\n");*/
        }
    }

    for(int i = 0; i < h; i++){
        Cvor* trenutniDesni = rezultat[i][0].desni;
        Cvor* trenutniLevi = rezultat[i][0].levi;
        int trenutniTok = 0;
        for(int j = 0; j < n; j++){
            if(rezultat[i][j].dole != NULL){
                rezultat[i + 1][j].tok += rezultat[i][j].tok;
                if(rezultat[i][j - 1].desni != NULL && rezultat[i][j - 1].levi != NULL && i >= 0 && j >= 1){
                        rezultat[i][j - 1].desni -> tok += trenutniTok/2;
                        rezultat[i][j - 1].levi -> tok += trenutniTok/2;
                        if(trenutniTok % 2 == 1){
                            if((i + 1) % 2 == 1){
                                rezultat[i][j - 1].levi -> tok += 1;
                            }else{
                                rezultat[i][j - 1].desni -> tok += 1;
                            }
                        }
                    }else if(rezultat[i][j - 1].desni != NULL && i >= 0 && j >= 1){
                        rezultat[i][j - 1].desni -> tok += trenutniTok;
                    }else if(rezultat[i][j - 1]. levi != NULL && i >= 0 && j >= 1){
                        rezultat[i][j - 1].levi -> tok += trenutniTok;
                    }
                    trenutniTok = 0;
                    trenutniDesni = NULL;
                    trenutniLevi = NULL;
            }else{
                trenutniTok += rezultat[i][j].tok;
                trenutniDesni = rezultat[i][j].desni;
                trenutniLevi = rezultat[i][j].levi;
            }
        }

        if(rezultat[i][n - 1].desni != NULL && rezultat[i][n - 1].levi != NULL){
            rezultat[i][n - 1].desni -> tok += trenutniTok/2;
            rezultat[i][n - 1].levi -> tok += trenutniTok/2;
            if(trenutniTok % 2 == 1){
                if((i + 1) % 2 == 1){
                    rezultat[i][n - 1].levi -> tok += 1;
                }else{
                    rezultat[i][n - 1].desni -> tok += 1;
                }
            }
        }else if(rezultat[i][n - 1].desni != NULL){
            rezultat[i][n - 1].desni -> tok += trenutniTok;
        }else if(rezultat[i][n - 1]. levi != NULL){
            rezultat[i][n - 1].levi -> tok += trenutniTok;
        }
        trenutniTok = 0;

    }

    for(int i = 0; i < n; i++){
        printf("%d ", rezultat[h][i].tok);
    }

    printf("\n");
/*
    printf("mdj\n");
    for(int i = 0; i < h; i++){
        for(int j = 0; j < n; j++){
            printf("%d ", rezultat[i][j].tok);
        }
        printf("\n");
    }*/

    return 0;
}