#include<set>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<algorithm>
using namespace std;
struct P{
    int x,y;
}p[100010];
typedef long long ll;
int n,A,B,D,tp,totx,toty,vis[100010],lshx[100010],lshy[100010];
ll ans;
pair<int,int>stk[100010];
set<pair<int,int> >Sx[100010],Sy[100010];
vector<int>Vx[100010],Vy[100010];
queue<int>q;
char buffer[1000010],*head,*tail;
inline char Getchar(){
    if(head==tail){
        int len=fread(buffer,1,1000000,stdin);
        head=buffer,tail=head+len;
        if(head==tail)
            return EOF;
    }
    return *head++;
}
inline int rd(){
    register int x=0;
    char c;
    do c=Getchar();
    while(!isdigit(c));
    do{
        x=(x<<1)+(x<<3)+(c^48);
        c=Getchar();
    }while(isdigit(c));
    return x;
}
int qyonx(int x,int l,int r){
    return distance(lower_bound(Vx[x].begin(),Vx[x].end(),l),upper_bound(Vx[x].begin(),Vx[x].end(),r));
}
int qxony(int y,int l,int r){
    return distance(lower_bound(Vy[y].begin(),Vy[y].end(),l),upper_bound(Vy[y].begin(),Vy[y].end(),r));
}
void calcx(int x,int l,int r){
    tp=0;
    for(set<pair<int,int> >::iterator iter=Sx[x].lower_bound(make_pair(l,0));iter!=Sx[x].end()&&(*iter).first<=r;iter++){
        stk[tp++]=*iter;
        if(!vis[(*iter).second]){
            vis[(*iter).second]=1;
            q.push((*iter).second);
        }
    }
    while(tp--)
        Sx[x].erase(stk[tp]);
    return;
}
void calcy(int y,int l,int r){
    tp=0;
    for(set<pair<int,int> >::iterator iter=Sy[y].lower_bound(make_pair(l,0));iter!=Sy[y].end()&&(*iter).first<=r;iter++){
        stk[tp++]=*iter;
        if(!vis[(*iter).second]){
            vis[(*iter).second]=1;
            q.push((*iter).second);
        }
    }
    while(tp--)
        Sy[y].erase(stk[tp]);
    return;
}
void solve(){
    q.push(A);
    vis[A]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        int lx=lower_bound(lshx+1,lshx+totx+1,lshx[p[u].x]-D)-lshx;
        int rx=lower_bound(lshx+1,lshx+totx+1,lshx[p[u].x]+D)-lshx;
        int ly=lower_bound(lshy+1,lshy+toty+1,lshy[p[u].y]-D)-lshy;
        int ry=lower_bound(lshy+1,lshy+toty+1,lshy[p[u].y]+D)-lshy;
        if(lshx[lx]==lshx[p[u].x]-D){
            ans+=qyonx(lx,lshy[p[u].y]-D,lshy[p[u].y]+D);
            calcx(lx,lshy[p[u].y]-D,lshy[p[u].y]+D);
        }
        if(lshx[rx]==lshx[p[u].x]+D){
            ans+=qyonx(rx,lshy[p[u].y]-D,lshy[p[u].y]+D);
            calcx(rx,lshy[p[u].y]-D,lshy[p[u].y]+D);
        }
        if(lshy[ly]==lshy[p[u].y]-D){
            ans+=qxony(ly,lshx[p[u].x]-D+1,lshx[p[u].x]+D-1);
            calcy(ly,lshx[p[u].x]-D,lshx[p[u].x]+D);
        }
        if(lshy[ry]==lshy[p[u].y]+D){
            ans+=qxony(ry,lshx[p[u].x]-D+1,lshx[p[u].x]+D-1);
            calcy(ry,lshx[p[u].x]-D,lshx[p[u].x]+D);
        }
    }
    return;
}
int main(){
    n=rd(),A=rd(),B=rd();
    for(int i=1;i<=n;i++){
        int x=rd(),y=rd();
        lshx[++totx]=p[i].x=x+y;
        lshy[++toty]=p[i].y=y-x;
    }
    D=max(abs(p[A].x-p[B].x),abs(p[A].y-p[B].y));
    sort(lshx+1,lshx+totx+1);
    totx=unique(lshx+1,lshx+totx+1)-(lshx+1);
    sort(lshy+1,lshy+toty+1);
    toty=unique(lshy+1,lshy+toty+1)-(lshy+1);
    for(int i=1;i<=n;i++){
        p[i].x=lower_bound(lshx+1,lshx+totx+1,p[i].x)-lshx;
        p[i].y=lower_bound(lshy+1,lshy+toty+1,p[i].y)-lshy;
        Sx[p[i].x].insert(make_pair(lshy[p[i].y],i));
        Sy[p[i].y].insert(make_pair(lshx[p[i].x],i));
        Vx[p[i].x].push_back(lshy[p[i].y]);
        Vy[p[i].y].push_back(lshx[p[i].x]);
    }
    for(int i=1;i<=totx;i++)
        sort(Vx[i].begin(),Vx[i].end());
    for(int i=1;i<=toty;i++)
        sort(Vy[i].begin(),Vy[i].end());
    solve();
    printf("%lld",ans>>1ll);
    return 0;
}

Measured memory_bytes: 32768