#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
int f[160][160];
bool g[160][160];
int d[2010][2010];
int n,m;
struct node
{
int step;
int x,y;
bool operator< (const node s) const
{
return step<s.step;
}
} a[2010];
int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};
void dfs()
{
for (int i = 1; i <= n; i ++ )
{
queue<node> q;
q.push({0,a[i].x,a[i].y});
g[a[i].x][a[i].y]=true;
while (!q.empty())
{
int xx=q.front().x,yy=q.front().y;
int uu=q.front().step;
if(f[xx][yy])
d[i][f[xx][yy]]=uu;
q.pop();
for (int j = 0; j < 8; j ++ )
{
int xx1=dx[j]+xx,yy1=dy[j]+yy;
if(xx1<=0||yy1<=0||xx1>m||yy1>m)
continue;
if(!g[xx1][yy1])
{
g[xx1][yy1]=true;
q.push({uu+1,xx1,yy1});
}
}
}
for (int i = 1; i <= m; i ++ )
for (int j = 1; j <= m; j ++ )
g[i][j]=false;
}
return ;
}
bool h[2010];
int sovle()
{
int res=1;
int k=n-1;
int ans=0;
set<node> q;
set<node>::iterator id;
while (k -- )
{
h[res]=true;
for (int i = 1; i <= n; i ++ )
if(!h[i])
q.insert({d[res][i],res,i});
id=q.begin();
node l=*id;
while (h[l.y])
{
q.erase(l);
id=q.begin();
l=*id;
}
q.erase(l);
res=l.y;
ans+=l.step;
}
return ans;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i].x >> a[i].y;
f[a[i].x][a[i].y]=i;
}
dfs();
cout << sovle()+n-1;
}