#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100;

int w, h;
bool input[N][N];
bool soto[N][N];
bool visited[N][N];
int dy[2][6] = {{-1, 0, 1, 1, 0, -1}, {-1, 0, 1, 1, 0, -1}};
int dx[2][6] = {{1, 1, 1, 0, -1, 0}, {0, 1, 0, -1, -1, -1}};


bool check(int y, int x){
  if(y<0 || y>=h) return false;
  if(x<0 || x>=w) return false;
  return true;
}

bool dfs(int y, int x){
  visited[y][x] = true;
  for(int i=0;i<6;i++){
    int ny = y + dy[y%2][i];
    int nx = x + dx[y%2][i];
    if(!check(ny, nx)) return true;
    if(input[ny][nx]) continue;
    if(visited[ny][nx]) continue;
    if(dfs(ny, nx)) return true;
  }
  return false;
}

void dfs2(int y, int x){
  soto[y][x] = true;
  for(int i=0;i<6;i++){
    int ny = y + dy[y%2][i];
    int nx = x + dx[y%2][i];
    if(!check(ny, nx)) continue;
    if(input[ny][nx]) continue;
    if(soto[ny][nx]) continue;
    dfs(ny, nx);
  }
}

int main(){
  cin >> w >> h;
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      cin >> input[i][j];
    }
  }
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      if(!input[i][j]){
        fill(visited[0], visited[N], false);
        if(dfs(i, j)){
          dfs2(i, j);
        }
      }
    }
  }
  int ans = 0;
  for(int i=0;i<h;i++){
    for(int j=0;j<w;j++){
      if(input[i][j]){
        for(int k=0;k<6;k++){
          int ny = i + dy[i%2][k];
          int nx = j + dx[i%2][k];
          if(!check(ny, nx)){
            ans++;
            continue;
          }
          if(soto[ny][nx]) ans++;
        }
      }
    }
  }
  cout << ans << endl;
  return 0;
}