#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream> 
using namespace std;

int n;
int m;
int a[501][501];

int Are1s(int i1, int j1, int i2, int j2, int i3, int j3)
{
  if (i1 < 0 || j1 < 0 || i2 < 0 || j2 < 0 || i3 < 0 || j3 < 0) return 0;
  if (i1 >= n || j1 >= m || i2 >= n || j2 >= m || i3 >= n || j3 >= m) return 0;
  return (a[i1][j1] && a[i2][j2] && a[i3][j3]);
}

int PartOfRect(int i, int j)
{
  return 
  // 11
  // 1*
  Are1s(i-1, j-1, i-1, j, i, j-1) ||

  // *1
  // 11
  Are1s(i, j+1, i+1, j, i+1, j+1) ||

  // 11
  // *1
  Are1s(i-1, j, i-1, j+1, i, j+1) ||

  // 1*
  // 11
  Are1s(i, j-1, i+1, j-1, i+1, j);
}

int n_up(int i, int j) 
{  
  if (i-1<0) return 0; 
  return a[i-1][j]; 
}

int n_down(int i, int j)
{
  if (i+1>=n) return 0;
  return a[i+1][j];
}

int n_left(int i, int j)
{
  if (j-1<0) return 0;
  return a[i][j-1];
}

int n_right(int i, int j)
{
  if (j+1>=m) return 0;
  return a[i][j+1];
}

void TryRemove(int i, int j)
{
  if (a[i][j] == 0) return;
  
  // if it has at least 3 bad neighbours, remove it  
  int good_neighbours = n_up(i,j) + n_down(i,j) + n_left(i,j) + n_right(i,j);
  if (good_neighbours <= 1)
  {
    a[i][j]=0;
    if (n_up(i,j)) TryRemove(i-1,j);
    if (n_down(i,j)) TryRemove(i+1, j);
    if (n_left(i,j)) TryRemove(i, j-1);
    if (n_right(i,j)) TryRemove(i, j+1);
  }
}

int main()
{
  // read input
  string tmp;
  getline(cin, tmp);
  stringstream ss(tmp);
  ss >> n; ss >> m;
  for(int i=0; i<n; i++)
  {
    string s;
    getline(cin, s);
    for(int j=0; j<m; j++)
    {
      if (s[j]=='0') a[i][j]=0;
        else a[i][j] = 1;
    }
  }

  // eliminate bad 1s
  for(int i=0; i<n; i++)
    for(int j=0; j<m; j++)
      TryRemove(i, j);

  // count remaining 1s 
  int c;
  for(int i=0; i<n; i++)
    for(int j=0; j<m; j++)
      c += a[i][j];
     
  // write solution
  cout << c;
  return 0;
}