#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int, int> P;
int W, H;
int X[102][102];
int dx1[6] = { -1, 0, 0, 1, 1, 1 };
int dy1[6] = { 0, -1, 1, -1, 0,1};
int dx2[6] = { -1, -1, -1, 0, 0, 1 };
int dy2[6] = { -1, 0, 1, -1, 1, 0 };
int main()
{
	scanf("%d%d", &W, &H);
	for (int i = 1; i <= H; i++){
		for (int j = 1; j <= W; j++){
			scanf("%d", &X[j][i]);
		}
	}
	
	for (int j = 1; j <= W; j++){
		for (int i = 1; i <= H; i++){
			if (X[j][i] == 0){
				bool F[102][102];
				for (int k = 0; k < 102; k++)for (int l = 0; l < 102; l++)F[k][l] = X[k][l]&1;
				priority_queue<P>que;
				que.push(make_pair(j,i));
				while (!que.empty()){
					P p = que.top(); que.pop();
					if (p.second == 0 || p.second == H + 1 || p.first == 0 || p.first == W + 1)goto aa;
					if (X[p.first][p.second]||F[p.first][p.second])continue;
					F[p.first][p.second] = true;
					if (p.second & 1){
						//if (i == 5 && j == 4)printf("%d %d\n", p.first, p.second);
						for (int k = 0; k < 6; k++){
							//if (i == 5 && j == 4)printf("%d %d %d\n", p.first + dx1[k], p.second + dy1[k], F[p.first+dx1[k]][p.second+dy1[k]]);


							if (!F[p.first + dx1[k]][p.second + dy1[k]]){
								que.push(make_pair(p.first + dx1[k], p.second + dy1[k]));
							}
						}
					}
					else{
						for (int k = 0; k < 6; k++){
							if (!F[p.first + dx2[k]][p.second + dy2[k]]){
								
								que.push(make_pair(p.first + dx2[k], p.second + dy2[k]));
							}
						}
					}
					//if (i == 5 && j == 4)printf("%d\n", que.size());
				}
				X[j][i] = 1; aa:;
			}
		}
	}
	
	int ans = 0;
	for (int i = 1; i <= W; i++){
		for (int j = 1; j <= H; j++){
			if (X[i][j] == 1){
				if (j & 1){
					for (int k = 0; k < 6; k++){
						if (!X[i + dx1[k]][j + dy1[k]])ans++;
					}
				}
				else{
					for (int k = 0; k < 6; k++){
						if (!X[i + dx2[k]][j + dy2[k]])ans++;
					}
				}
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}