44pts WA
#include<cstdio>
#include<vector>
#include<map>
#include<deque>
using namespace std;
const int maxn=500010;
typedef pair<int,int> P;
P rock[maxn];
map<P,int>have;
map<int,bool>searched;
vector<int>line[maxn];
vector<int>start;
int n,t;
inline void init()
{
scanf("%d%d",&n,&t);
for(register int i=1;i<=n;i++)
{
scanf("%d%d",&rock[i].first,&rock[i].second);
have[rock[i]]=i;
}
for(register int i=1;i<=n;i++)
{
for(int j=rock[i].first-2;j<=rock[i].first+2;j++)
for(int k=rock[i].second-2;k<=rock[i].second+2;k++)
{
P tmp;tmp.first=j;tmp.second=k;
if(have.count(tmp)) line[i].push_back(have[tmp]);
}
}
for(register int i=-2;i<=2;i++)
for(register int j=-2;j<=2;j++)
{
P tmp;tmp.first=i;tmp.second=j;
if(have.count(tmp)) start.push_back(have[tmp]);
}
}
inline void BFS()
{
deque<int>bfs;
int len=start.size();
for(register int i=0;i<len;i++)
{
bfs.push_back(start[i]);
searched[start[i]]=true;
}
int size=1;
while(!bfs.empty())
{
size++;
int tmp=bfs.front();
bfs.pop_front();
int tlen=line[tmp].size();
for(int i=0;i<tlen;i++)
{
if(searched[line[tmp][i]]) continue;
bfs.push_back(line[tmp][i]);
searched[line[tmp][i]]=true;
if(rock[line[tmp][i]].second==t)
{
printf("%d\n",size-1);
return;
}
}
}
printf("%d\n",-1);
}
int main()
{
init();
BFS();
}