#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int h, n;
	cin >> h >> n;

	vector<int> voda(n, 1); // Popunjavamo vektor voda sa jedinicama na pocetku

	for (int i = 1; i <= h; i++)
	{
		// Ucitavamo red matrice i stavljamo ga u vektor
		vector<bool> red;
		for (int j = 0; j < n; j++)
		{
			bool a;
			cin >> a;
			red.push_back(a);
		}

		vector<int> nova_voda(voda); // Kopiramo prethodni red vode u pomocni vektor, ne smemo direktno da menjamo vektor voda
		int j = 0;
		while (j < n)
		{
			int zbir = 0;
			int l, d;
			
			if (red[j] == 0)
			{
				// Trazi levu u desnu granicu uzastopnih kamenova i racuna
				// ukupno vode na tom nizu kamnenja (promenljiva zbir)
				l = j - 1;
				while (j < n && red[j] == 0)
				{
					nova_voda[j] = 0; // Ako je kamen ispod, skloni svu vodu sa tog polja
					zbir += voda[j];
					d = j + 1;
					j++;
				}
				j--;

				if (l == -1) // Levo je zid, prebaci svu vodu na prvi desni slobodan
				{
					nova_voda[d] += zbir;
				}
				else if (d == n) // Desno je zid, prebaci svu vodu na prvi levi slobodan
				{
					nova_voda[l] += zbir;
				}
				else if (zbir % 2 == 0) // Pola stavi na levo, pola na desno
				{
					nova_voda[l] += zbir / 2;
					nova_voda[d] += zbir / 2;
				}
				else if (i % 2 == 0) // Stavi jedan vise na desno
				{
					nova_voda[l] += zbir / 2;
					nova_voda[d] += zbir / 2 + 1;
				}
				else // Stavi jedan vise na levo
				{
					nova_voda[l] += zbir / 2 + 1;
					nova_voda[d] += zbir / 2;
				}
			}
			j++;
		}
		voda = nova_voda; // Postavljamo pokazivac vektora voda na pokazivac vektora nova_voda (u sustini postavljamo vektor voda na vektor nova_voda)
	}

	// Ispisi poslednji red vode
	for (auto a : voda)
	{
		cout << a << " ";
	}
}