rt.
//Name:Lazy_doghead
#include<bits/stdc++.h>
#define U unsigned
#define INT int
#define LNG long
#define TLNG LNG LNG
#define UINT U INT
#define UTLNG U TLNG
#define STR string
#define CA char
#define BL bool
#define DB double
#define FL float
#define rep(i,k,n) for(i=k;i<=n;i++)
#define tep(i,n,k) for(i=n;i>=k;i--)
using namespace std;
INT n,m,a[1010][1010],i,j,k,ans,x,y,py[11]={-1,-1,-1,0,1,1,1,0},px[11]={-1,0,1,1,1,0,-1,-1};
BL ok[1010][1010];
void bzdgs(INT x,INT y){
BL l=false;
INT xx,yy;
rep(i,0,7){
if(l)break;
xx=x+px[i];
yy=y+py[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m){
if(a[xx][yy]==1)l=true;
}
}
if(!l)a[x][y]=2;
else a[x][y]=3;
return;
}
void dfs(INT x,INT y){
ok[x][y]=true;
INT xx,yy;
rep(i,0,7){
xx=x+px[i];
yy=y+py[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m){
if(a[xx][yy]==2&&ok[xx][yy]==false)dfs(xx,yy);
}
}
return;
}
BL check(INT x,INT y){
INT xx,yy;
rep(i,0,7){
xx=x+px[i];
yy=y+py[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m){
if(a[xx][yy]==2)return false;
}
}
return true;
}
int main(){
scanf("%d%d",&n,&m);
rep(i,1,n){
rep(j,1,m)scanf("%d",&a[i][j]);
}
rep(i,1,n){
rep(j,1,m){
if(!a[i][j])bzdgs(i,j);
}
}
rep(i,1,n){
rep(j,1,m){
if(a[i][j]==2&&!ok[i][j]){
dfs(i,j);
ans++;
}
}
}
rep(i,1,n){
rep(j,1,m){
if(a[i][j]==3){
if(check(i,j))ans++;
}
}
}
printf("%d",ans);
return 0;
}