#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
struct edge{int nxt,to;}e[MAXN*8];
struct data{int x,y,id;}dat[MAXN];
int n,d,a,b,x,y,head[MAXN],vis[MAXN],cnt[MAXN],tot=0;
ll res=0;

void add_edge(int from,int to)
{
	e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;
	e[++tot].nxt=head[to];e[tot].to=from;head[to]=tot;
}

bool operator < (data a,data b)
{
	if(a.x!=b.x) return a.x<b.x;
	return a.y<b.y;
}

void solve(int k)
{
	sort(dat+1,dat+n+1);
	int cur,lst,l,r;
	for(cur=lst=l=r=1;cur<=n;cur++)
	{
		while((dat[l].x<dat[cur].x+d||dat[l].x==dat[cur].x+d&&dat[l].y<dat[cur].y-k)&&l<=n) l++;
		while((dat[r].x<dat[cur].x+d||dat[r].x==dat[cur].x+d&&dat[r].y<=dat[cur].y+k)&&r<=n) r++;
		if(l>n) break;
		cnt[dat[cur].id]+=r-l;lst=max(lst,l);
		if(lst>=r) continue;
		
		add_edge(dat[cur].id,dat[lst].id);
		for(;lst<r-1;lst++) add_edge(dat[lst].id,dat[lst+1].id);
	}
}

void dfs(int x)
{
	vis[x]=true;res+=cnt[x];
	for(int i=head[x];i;i=e[i].nxt)
		if(!vis[e[i].to]) dfs(e[i].to);
}

int main()
{
	scanf("%d%d%d",&n,&a,&b);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&x,&y),dat[i]={x+y,x-y,i};
	
	d=max(abs(dat[a].x-dat[b].x),abs(dat[a].y-dat[b].y));
	solve(d);
	for(int i=1;i<=n;i++) swap(dat[i].x,dat[i].y);
	solve(d-1);
	
	dfs(a);printf("%lld",res);
	return 0;
}