#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<queue>
#define ll long long
using namespace std;
const double pi=acos(-1);
const double eps=1e-12;
const int maxn=1e5;
int n,a,b,tot;
ll ans,d;
bool vis[maxn+8];
 
int read()
{
    int x=0,f=1;char ch=getchar();
    for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    return x*f;
}
 
struct Vertex
{
    ll x,y;
    int id;
}V[maxn+8],f1[maxn+8],f2[maxn+8];
bool cmp1(Vertex a,Vertex b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
bool cmp2(Vertex a,Vertex b){return a.y!=b.y?a.y<b.y:a.x<b.x;}
//bool operator ==(Vertex a,Vertex b){return a.x==b.x&&a.y==b.y;}
//bool operator !=(Vertex a,Vertex b){return a.x!=b.x||a.y!=b.y;}
struct My_Cmp1
{
    bool operator()(const Vertex &a,const Vertex &b)
    {return a.x!=b.x?a.x<b.x:a.y<b.y;}
};
struct My_Cmp2
{
    bool operator()(const Vertex &a,const Vertex &b)
    {return a.y!=b.y?a.y<b.y:a.x<b.x;}
};
set<Vertex,My_Cmp1>st1;
set<Vertex,My_Cmp2>st2;
queue<Vertex>stack;
 
void work_1(ll x,ll l,ll r)
{
    set<Vertex,My_Cmp1>::iterator it=st1.lower_bound((Vertex){x,l});
    while(it!=st1.end())
    {
        Vertex p=*it;
        if (p.x>x||p.y>r) break;
        vis[p.id]=1;
        it++;
        st1.erase(p),st2.erase(p);
        stack.push(p);
        //printf("get1:%d\n",p.id);
        }
}
 
void work_2(ll y,ll l,ll r)
{
    set<Vertex,My_Cmp2>::iterator it=st2.lower_bound((Vertex){l,y});
    while(it!=st2.end())
    {
        Vertex p=*it;
        if (p.x>r||p.y>y) break;
        vis[p.id]=1;
        it++;
        st1.erase(p),st2.erase(p);
        stack.push(p);
        //printf("get2:%d\n",p.id);
    }
}
 
int find_1(ll x,ll y)
{
	//printf("Enter:%.5lf %.5lf\n",x,y);
	int l=1,r=tot,tmp=tot+1;
	while(l<=r)
		{
			int mid=(l+r)>>1;
			if (f1[mid].x>x||(f1[mid].x==x&&f1[mid].y>=y)) tmp=mid,r=mid-1;
			else l=mid+1;
		}
	return tmp;
}
 
int find_2(ll x,ll y)
{
	//printf("Enter:%.5lf %.5lf\n",x,y);
	int l=1,r=tot,tmp=tot+1;
	while(l<=r)
		{
			int mid=(l+r)>>1;
			if (f2[mid].y>y||(f2[mid].y==y&&f2[mid].x>=x)) r=mid-1,tmp=mid;
			else l=mid+1;
		}
	return tmp;
}
 
void solve_1(ll x,ll l,ll r)
{
	int s1=find_1(x,l),s2=find_1(x,r);
	if (f1[s2].x!=x||f1[s2].y!=r) s2--;
	//	printf("check:%.5lf %.5lf %.5lf %d %d\n",x,l,r,s1,s2);
	ans+=s2-s1+1;
	if (f1[s1].x==x&&f1[s1].y==l) ans--;
	if (f1[s2].x==x&&f1[s2].y==r) ans--;
}
 
void solve_2(ll y,ll l,ll r)
{
	int s1=find_2(l,y),s2=find_2(r,y);
	if (f2[s2].x!=r||f2[s2].y!=y) s2--;
	ans+=s2-s1+1;
}
int main()
{
    n=read(),a=read(),b=read();
    for (int i=1;i<=n;i++)
    {
        ll x=read(),y=read();
        V[i].x=x+y,V[i].y=x-y,V[i].id=i;
        if (i!=a&&i!=b) st1.insert(V[i]),st2.insert(V[i]);
    }
    vis[a]=vis[b]=1;
    d=max(abs(V[a].x-V[b].x),abs(V[a].y-V[b].y));
    stack.push(V[a]),stack.push(V[b]);
    while(!stack.empty())
    {
        Vertex p=stack.front();stack.pop();
        //printf("Enter:%d\n",p.id);
        work_1(p.x+d,p.y-d,p.y+d);
        work_1(p.x-d,p.y-d,p.y+d);
        work_2(p.y+d,p.x-d,p.x+d);
        work_2(p.y-d,p.x-d,p.x+d);
    }
	for (int i=1;i<=n;i++) if (vis[i]) f1[++tot]=V[i],f2[tot]=V[i];
	sort(f1+1,f1+tot+1,cmp1);
	sort(f2+1,f2+tot+1,cmp2);
	//puts("Prepare");
	//for (int i=1;i<=tot;i++) printf("%.5lf %.5lf\n",f1[i].x,f1[i].y);
    for (int i=1;i<=n;i++)
    if (vis[i])
        {
			Vertex p=V[i];
			solve_1(p.x+d,p.y-d,p.y+d);
			solve_1(p.x-d,p.y-d,p.y+d);
			solve_2(p.y+d,p.x-d,p.x+d);
			solve_2(p.y-d,p.x-d,p.x+d);
        }
	printf("%lld\n",ans/2);
    return 0;
}


Measured memory_bytes: 20352