using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Petlja_3
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] ulaz = Console.ReadLine().Split(); //ucitavanje podataka
            int visina = int.Parse(ulaz[0]);
            int sirina = int.Parse(ulaz[1]);
            int[,] matrica = new int[visina, sirina];
            int pocetak = 0;
            int kraj = sirina - 1; //postavljanje granica niza u sirini

            int[] trenutnoStanje = new int[sirina];
            int[] prosloStanje = new int[sirina];
            int[] tempStanje = new int[sirina];

            for (int i = 0; i < visina; i++) //ucitavanje matrice
            {
                ulaz = Console.ReadLine().Split();

                trenutnoStanje = new int[sirina];
                prosloStanje = new int[sirina];
                bool deoNizaStena = false;
                int vrednostNizaStena = 0;
                int pocetakNizaStena = -1;
                int krajNizaStena = -1;
                int k = 0;//postavljanje inicijalnih vrednosti za niz stene, k se koristi da oznacimo koji je pravi pocetak

                for (int j = 0; j < sirina; j++)
                {
                    matrica[i, j] = int.Parse(ulaz[j]);
                }

                for (int j = 0; j < sirina; j++)
                {
                    //Console.WriteLine(deoNizaStena);
                    if (i == 0) //ako namestamo u prvom redu inicijalne vrednosti
                    {
                        if (matrica[i, j] == 1) //imamo vodopad obicni
                        {
                            if (!deoNizaStena) //ako nismo imali niz stena pre ovoga, samo stavimo 1
                            {
                                trenutnoStanje[j]++;
                            }
                            else //ako smo imali niz stena pre ovoga i sad vise nemamo
                            {
                                k = 0;
                                vrednostNizaStena = 0;
                                deoNizaStena = false;
                                krajNizaStena = j; //resetujemo vrednost niza stena i stavimo da vise nismo u njemu, postavljamo da je ovaj index kraj

                                if (pocetakNizaStena == pocetak) //ako je pocetak niza stena bio i pocetak celog niza tj nema nista levo
                                {
                                    trenutnoStanje[j] += vrednostNizaStena; //dodajemo ceo tok na kraj,desno
                                }
                                else //ako je niz stena negde u sredini nije ni na kraju ni pocetku
                                {
                                    trenutnoStanje[j] += (int)Math.Floor((double)vrednostNizaStena / 2.0);
                                    trenutnoStanje[pocetakNizaStena - 1] += (int)Math.Floor((double)vrednostNizaStena / 2.0);
                                    int ostatak = vrednostNizaStena % 2;
                                    trenutnoStanje[pocetakNizaStena - 1]++; //dodajemo tok vode na pocetak i kraj niza stena desno i levo i ostatak levo jer je 1 neparan broj. inace bi bilo desno i proveravali bismo parnost
                                }
                            }
                        }
                        else //0, ako smo na steni
                        {
                            if (j != kraj && matrica[i, j + 1] == 0) //ako stena nije na kraju i sledeci objekat u nizu je isto stena
                            {
                                vrednostNizaStena++; //pojacavamo tok
                                if (k == 0) // ako je ovo pocetak postavljamo pocetak i stavljamo da je niz poceo
                                {
                                    deoNizaStena = true;
                                    pocetakNizaStena = j;
                                    k = 1;
                                }
                                continue;
                            }
                            if (j == pocetak) //ako je stena na pocetku a nije u nizu stena (continue) samo ga prskamo desno za 1 (tok)
                            {
                                trenutnoStanje[j + 1]++;
                            }
                            else if (j == kraj) //ako je stena na kraju niza
                            {
                                if (!deoNizaStena) //ako nismo u nizu stena onda samo levo isprskamo 1 (tok)
                                {
                                    trenutnoStanje[j - 1]++;
                                }
                                else //ako jesmo u nizu stena onda ga zavrsavamo i levo od pocetka niza stena prskamo sa celom vrednoscu
                                {
                                    vrednostNizaStena++;
                                    trenutnoStanje[pocetakNizaStena - 1] += vrednostNizaStena;
                                    deoNizaStena = false;
                                    krajNizaStena = j;
                                    k = 0;
                                    vrednostNizaStena = 0;
                                }
                            }
                            else //ako stena nije u nizu stena, nije ni na pocetku ni na kraju nego u sredini u sustini samo prskamo 1 ulevo jer je 1 redan broj
                            {
                                trenutnoStanje[j - 1]++;
                            }
                        }
                    }
                    else // ako nije prvi red, ovo je core
                    {
                        prosloStanje = new int[sirina];
                        tempStanje.CopyTo(prosloStanje, 0); //postavljanje proslog stanja i reset tempa
                        if (prosloStanje[j] == 0) // iznad imamo stenu
                        {
                            if (matrica[i, j] != 0)
                            {
                                if (deoNizaStena) //ovde se zavrsava niz stena
                                {
                                    if (pocetakNizaStena != pocetak) // ako niz nije poceo od 0 raspodeljujemo prskamo na 2 mesta
                                    {
                                        krajNizaStena = j;
                                        trenutnoStanje[j] += (int)Math.Floor((double)vrednostNizaStena / 2.0);
                                        trenutnoStanje[pocetakNizaStena - 1] += (int)Math.Floor((double)vrednostNizaStena / 2.0);
                                        int ostatak = vrednostNizaStena % 2; //prskam levo i desno od niza, ostatak dajem gde treba
                                        if ((i + 1) % 2 == 0)
                                        {
                                            trenutnoStanje[j] += ostatak;
                                        }
                                        else
                                        {
                                            trenutnoStanje[pocetakNizaStena - 1] += ostatak;
                                        }
                                    }
                                    else // ako je poceo od 0 prskamo sve na desnu stranu
                                    {
                                        krajNizaStena = j;
                                        trenutnoStanje[j] += vrednostNizaStena;
                                    }
                                    k = 0; //resetujem niz stena
                                    vrednostNizaStena = 0;
                                    deoNizaStena = false;
                                }
                            }
                            else
                            {
                                if (j == kraj)
                                {
                                    trenutnoStanje[pocetakNizaStena - 1] += prosloStanje[j];
                                    trenutnoStanje[pocetakNizaStena - 1] += vrednostNizaStena;
                                    k = 0;
                                    deoNizaStena = false;
                                    vrednostNizaStena = 0;
                                }
                            }
                        }
                        else // iznad je tok
                        {
                            if (matrica[i, j] == 1) // i dole je tok
                            {
                                trenutnoStanje[j] += prosloStanje[j];
                                if (deoNizaStena) //ovde se zavrsava niz stena
                                {
                                    if (pocetakNizaStena != pocetak) // ako niz nije poceo od 0 raspodeljujemo prskamo na 2 mesta
                                    {
                                        krajNizaStena = j;
                                        trenutnoStanje[j] += (int)Math.Floor((double)vrednostNizaStena / 2.0);
                                        trenutnoStanje[pocetakNizaStena - 1] += (int)Math.Floor((double)vrednostNizaStena / 2.0);
                                        int ostatak = vrednostNizaStena % 2; //prskam levo i desno od niza, ostatak dajem gde treba
                                        if ((i + 1) % 2 == 0)
                                        {
                                            trenutnoStanje[j] += ostatak;
                                        }
                                        else
                                        {
                                            trenutnoStanje[pocetakNizaStena - 1] += ostatak;
                                        }
                                    }
                                    else // ako je poceo od 0 prskamo sve na desnu stranu
                                    {
                                        krajNizaStena = j;
                                        trenutnoStanje[j] += vrednostNizaStena;
                                    }
                                    k = 0; //resetujem niz stena
                                    vrednostNizaStena = 0;
                                    deoNizaStena = false;
                                }
                            }
                            else // dole je stena
                            {
                                if (j == pocetak && sirina >= 2 && matrica[i, j + 1] != 0) //stena je na pocetku i nema ispred nis
                                {
                                    trenutnoStanje[j + 1] += prosloStanje[j];
                                }
                                else if (j == kraj) //stena je na kraju
                                {
                                    if (!deoNizaStena) //moras i gore..
                                    {
                                        trenutnoStanje[j - 1] += prosloStanje[j];
                                    }
                                    else //ovde se zavrsava niz stena
                                    {
                                        trenutnoStanje[pocetakNizaStena - 1] += prosloStanje[j];
                                        trenutnoStanje[pocetakNizaStena - 1] += vrednostNizaStena;
                                        k = 0;
                                        deoNizaStena = false;
                                        vrednostNizaStena = 0;
                                    }
                                }
                                else //stena u sredini il pocetak
                                {
                                    if (j != kraj && matrica[i, j + 1] == 0) //ako nismo na kraju a imamo jos jednu stenu pored znaci u nizu smo
                                    {
                                        if (k == 0)
                                        {
                                            deoNizaStena = true;
                                            pocetakNizaStena = j;
                                            k = 1;
                                        }
                                        vrednostNizaStena += prosloStanje[j];
                                        continue;
                                    }
                                    else
                                    {
                                        int jednakDeo = (int)Math.Floor((double)prosloStanje[j] / 2.0); //deo koji ide i levo i desno od ovog gore
                                        trenutnoStanje[j - 1] += jednakDeo;
                                        trenutnoStanje[j + 1] += jednakDeo;
                                        int razlika = prosloStanje[j] % 2;
                                        if ((i + 1) % 2 == 0) //ako je red neparan ostatak ide levo a ako je paran desno
                                        {
                                            trenutnoStanje[j + 1] += razlika;
                                        }
                                        else
                                        {
                                            trenutnoStanje[j - 1] += razlika;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                tempStanje = new int[sirina];
                trenutnoStanje.CopyTo(tempStanje, 0);
            }

            for (int i = 0; i < trenutnoStanje.Length; i++)
            {
                Console.Write(trenutnoStanje[i] + " ");
            }
        }
    }
}