#include <cstdio>
#include <algorithm>
#define repu(i,x,y) for (int i=x; i<=y; ++i)
#define mid ((l+r)>>1)
using namespace std;

typedef long long LL;
int n,a,b,d,x[100100],y[100100];
LL ans;
bool flag[100100];
struct data
{
    int k,x,id;
    bool operator<(const data &t) const
    {
        return k<t.k || k==t.k && x<t.x;
    }
};
struct set
{
    int nxt[100100];
    data a[100100];
    int find(int x)
    {
        if (nxt[x]==x)
            return x;
        return nxt[x]=find(nxt[x]);
    }
    void build(int u,int v)
    {
        repu(i,1,n+1)
            a[i]=(data){u*x[i]+v*y[i],u*x[i],i},nxt[i]=i;
        sort(a+1,a+1+n);
    }
    int query(data x)
    {
        int l=1,r=n+1;
        while (l<r)
            a[mid]<x?l=mid+1:r=mid;
        return l;
    }
    void calc(int k,int ql,int qr);
} s[4];

void insert(int k)
{
    if (flag[k])
        return;
    flag[k]=1;
    s[0].calc(x[k]+y[k]+d,x[k],x[k]+d-1);
    s[1].calc(x[k]-y[k]+d,x[k]+1,x[k]+d);
    s[2].calc(-x[k]+y[k]+d,-x[k]+1,-x[k]+d);
    s[3].calc(-x[k]-y[k]+d,-x[k],-x[k]+d-1);
}

void set::calc(int k,int ql,int qr)
{
    int l=query((data){k,ql}),r=query((data){k,qr+1});
    ans+=r-l;
    for (; (l=find(l))<r; ++l)
        nxt[l]=l+1,insert(a[l].id);
}

int main()
{
    scanf("%d%d%d",&n,&a,&b);
    repu(i,1,n)
        scanf("%d%d",&x[i],&y[i]);
    s[0].build(1,1),s[1].build(1,-1),s[2].build(-1,1),s[3].build(-1,-1);
    d=abs(x[a]-x[b])+abs(y[a]-y[b]),insert(a);
    printf("%lld\n",ans/2);
    return 0;
}