#include<bits/stdc++.h>
using namespace std;
const int N=2e3+100;
const int M=2e2+10;
int step[M][M];
int mp2[M][M];
bool k[M][M];
int _x[N],_y[N];
int s[N];
int o[10]={1,2,-1,-2,1,2,-1,-2};
int u[10]={-2,-1,2,1,2,1,-2,-1};
struct edge{
int from,to,w;
};
struct node{
int x,y;
};
bool cmp(edge a,edge b){
return a.w<b.w;
}
int find_set(int x){
if (x!=s[x]){
s[x]=find_set(s[x]);
}
return s[x];
}
edge e[N*N];
int n,m,sum;
void mem(){
for (int i=0;i<=n+10;i++)
for (int j=0;j<=n+10;j++)
step[i][j]=k[i][j]=0;
}
void Kruskal(){
sort(e+1,e+1+sum,cmp);
for (int i=1;i<=n;i++) s[i]=i;
int ans=0,cnt=0;
for (int i=1;i<=sum;i++){
if (cnt==n-1) break;
int e1=find_set(e[i].from);
int e2=find_set(e[i].to);
if (e1==e2) continue;
s[e1]=e2;
ans+=e[i].w;
cnt++;
}
cout<<ans+n-1;
}
void bfs(int r){
queue <node> q;mem();
k[_x[r]][_y[r]]=1;
q.push((node){_x[r],_y[r]});
while (!q.empty()){
node v=q.front();q.pop();
for (int i=0;i<=7;i++){
int x2=v.x+o[i],y2=v.y+u[i];
if (x2<=0 || y2<=0 || x2>m || y2>m || k[x2][y2]) continue;
if (mp2[x2][y2]) e[++sum]=(edge){r,mp2[x2][y2],step[v.x][v.y]+1};
k[x2][y2]=1;
step[x2][y2]=step[v.x][v.y]+1;
q.push((node){x2,y2});
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>_x[i]>>_y[i];
mp2[_x[i]][_y[i]]=i;
}
for (int i=1;i<=n;i++){
bfs(i);
}
Kruskal();
return 0;
}