#include <iostream>
#include <stack>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>

int max(int a,int b){
	if(a>=b)return a;
	else return b;
}

int min(int a,int b){
	if(a>=b)return b;
	else return a;
}

void swap(int *a,int *b){
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void babbleSort(int *data,int n){
	for(int i=0;i<n;i++){
		for(int j=n-1;j>i;j--){
			if(data[j]>=data[j-1]){
				swap(&data[j],&data[j-1]);
			}
		}
	}
}


using namespace std;

/*
cin.ignore();
	getline(cin,dataStr);
	data = new int[n];
	stringToInteger(&dataStr,data,n);
*/

void stringToInteger(string *str,int *data,int n){
	for(int i=1;i<=n;i++){
		int spaceN = str->find(' ',0);

		data[i] = atoi(str->substr(0,spaceN).c_str());
		str->erase(0,spaceN+1);
	}
}

int main(){

	int w,h;
	int data[110][110];
	int flag[110][110];
	int searchX[2][6]={{-1,-1,-1,0,+1,0},{0,-1,0,+1,+1,+1}};
	int searchY[6]={-1,0,+1,-1,0,+1};

	for(int i=0;i<110;i++){
		for(int j=0;j<110;j++){
			data[i][j]=0;
			flag[i][j]=0;
		}
	}

	cin>>w>>h;
	cin.ignore();
	string str;
	for(int i=1;i<=h;i++){
		getline(cin,str);
		stringToInteger(&str,data[i],w);
	}
/*
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			printf("%2d ",data[i][j]);
		}
		cout<<endl;
	}
*/
	queue<int> x;
	queue<int> y;
	x.push(0);
	y.push(0);
	while(x.size()!=0){
		int topX = x.front();
		int topY = y.front();
		x.pop();
		y.pop();
		flag[topY][topX]=1;
		for(int i=0;i<6;i++){
			int sx=topX+searchX[topY%2][i];
			int sy=topY+searchY[i];

			if(sx<0||sx>=105||sy<0||sy>=105)continue;
			if(flag[sy][sx]==0&&data[sy][sx]==0){
				x.push(sx);
				y.push(sy);
				flag[sy][sx]=1;
			}
		}
	}/*
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			printf("%2d ",flag[i][j]);
		}
		cout<<endl;
	}*/

	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			if(data[i][j]==1&&flag[i][j]==0){
				x.push(j);
				y.push(i);
				while(x.size()!=0){
					int topX = x.front();
					int topY = y.front();
					x.pop();
					y.pop();
					flag[topY][topX]=1;
					int sCnt=0;
					for(int i=0;i<6;i++){
						int sx=topX+searchX[topY%2][i];
						int sy=topY+searchY[i];
						
						if(sx<0||sx>=105||sy<0||sy>=105)continue;
						if(data[sy][sx]>=1){
							sCnt++;
						}
						if(flag[sy][sx]==0&&data[sy][sx]>=1){
							x.push(sx);
							y.push(sy);
							flag[sy][sx]=1;
						}
					}
					data[topY][topX] = 10+sCnt;
				}
			}
		}
	}
/*
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			printf("%2d ",flag[i][j]);
		}
		cout<<endl;
	}*/

	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			if(flag[i][j]==0&&data[i][j]==0){
				x.push(j);
				y.push(i);
				while(x.size()!=0){
					int topX = x.front();
					int topY = y.front();
					x.pop();
					y.pop();
					flag[topY][topX]=1;
					int sCnt=0;
					for(int k=0;k<6;k++){
						int sx=topX+searchX[topY%2][k];
						int sy=topY+searchY[k];
						
						if(sx<0||sx>=105||sy<0||sy>=105)continue;
						if(data[sy][sx]<=0){
							sCnt++;
						}
						if(flag[sy][sx]==0&&data[sy][sx]==0){
							x.push(sx);
							y.push(sy);
							flag[sy][sx]=1;
						}
					}
					data[topY][topX] = -(10+sCnt);
				}
			}
		}
	}
	int ans=0;
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			if(data[i][j]>0){
				ans += (16-data[i][j]);
			}
			else if(data[i][j]<0){
				ans += (-16-data[i][j]);
			}
		}
	}
	/*
	for(int i=1;i<=h;i++){
		for(int j=1;j<=w;j++){
			printf("%2d ",data[i][j]);
		}
		cout<<endl;
	}
	*/
	cout<<ans<<endl;

	return 0;

}

Measured memory_bytes: 1340