#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cerrno>
#include<cfloat>
#include<ciso646>
#include<climits>
#include<clocale>
#include<cmath>
#include<complex>
#include<csetjmp>
#include<csignal>
#include<cstdarg>
#include<cstddef>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<ctype.h>
#include<cwchar>
#include<cwctype>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<locale>
#include<map>
#include<math.h>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<stdio.h>
#include<stdlib.h>
#include<streambuf>
#include<string.h>
#include<string>
#include<typeinfo>
#include<utility>
#include<valarray>
#include<vector>
#define x first
#define y second
#define m_p make_pair
using namespace std;
typedef long long LL;
map<LL,vector<LL> > indm,inds;
map<LL,vector<int> > fam,fas;
set<pair<LL,LL> > vis,all;
LL res;
LL d;
int get(vector<int> &a,int i){
	return (a[i]==i)?i:a[i]=get(a,a[i]);
}
bool sameset(vector<int> &a,int i,int j){
	return (get(a,i)==get(a,j));
}
void unite(vector<int> &a,int i,int j){
	a[get(a,i)]=get(a,j);
}
void dfs(LL cm,LL cs);
void addm(LL cm,LL st,LL ed){
	if (st>ed) swap(st,ed);
	if (indm.find(cm+d)!=indm.end()){
		vector<LL> &t=indm[cm+d];
		int hd=lower_bound(t.begin(),t.end(),st)-t.begin();
		int tl=upper_bound(t.begin(),t.end(),ed)-t.begin();
		res+=tl-hd;
		for (int i=get(fam[cm+d],hd);i<tl;i=get(fam[cm+d],i)){
			fam[cm+d][i]=i+1;
			dfs(cm+d,t[i]);
		}
	}
	if (indm.find(cm-d)!=indm.end()){
		vector<LL> &t=indm[cm-d];
		int hd=lower_bound(t.begin(),t.end(),st)-t.begin();
		int tl=upper_bound(t.begin(),t.end(),ed)-t.begin();
		res+=tl-hd;
		for (int i=get(fam[cm-d],hd);i<tl;i=get(fam[cm-d],i)){
			fam[cm-d][i]=i+1;
			dfs(cm-d,t[i]);
		}
	}
}
void adds(LL cs,LL st,LL ed){
	if (st>ed) swap(st,ed);
	if (inds.find(cs+d)!=inds.end()){
		vector<LL> &t=inds[cs+d];
		int hd=lower_bound(t.begin(),t.end(),st)-t.begin();
		int tl=upper_bound(t.begin(),t.end(),ed)-t.begin();
		res+=tl-hd;
		for (int i=get(fas[cs+d],hd);i<tl;i=get(fas[cs+d],i)){
			fas[cs+d][i]=i+1;
			dfs(t[i],cs+d);
		}
	}
	if (inds.find(cs-d)!=inds.end()){
		vector<LL> &t=inds[cs-d];
		int hd=lower_bound(t.begin(),t.end(),st)-t.begin();
		int tl=upper_bound(t.begin(),t.end(),ed)-t.begin();
		res+=tl-hd;
		for (int i=get(fas[cs-d],hd);~i&&i<tl;i=get(fas[cs-d],i)){
			fas[cs-d][i]=i+1;
			dfs(t[i],cs-d);
		}
	}
}
void dfs(LL cm,LL cs){
	if (vis.find(m_p(cm,cs))!=vis.end()) return;
	vis.insert(m_p(cm,cs));
	addm(cm,cs-d,cs+d);
	adds(cs,cm-d,cm+d);
	if (all.find(m_p(cm-d,cs-d))!=all.end()) res--;
	if (all.find(m_p(cm-d,cs+d))!=all.end()) res--;
	if (all.find(m_p(cm+d,cs-d))!=all.end()) res--;
	if (all.find(m_p(cm+d,cs+d))!=all.end()) res--;
}
LL cox[100010],coy[100010];
int main(void){
	int n,a,b;
	scanf("%d%d%d",&n,&a,&b);
	for (int i=1;i<=n;i++){
		scanf("%lld%lld",&cox[i],&coy[i]);
		indm[cox[i]-coy[i]].push_back(cox[i]+coy[i]);
		inds[cox[i]+coy[i]].push_back(cox[i]-coy[i]);
		fam[cox[i]-coy[i]].push_back(fam[cox[i]-coy[i]].size());
		fas[cox[i]+coy[i]].push_back(fas[cox[i]+coy[i]].size());
		all.insert(m_p(cox[i]-coy[i],cox[i]+coy[i]));
	}
	for (map<LL,vector<LL> >::iterator it=indm.begin();it!=indm.end();it++){
		sort(it->y.begin(),it->y.end());
		fam[it->x].push_back(fam[it->x].size());
	}
	for (map<LL,vector<LL> >::iterator it=inds.begin();it!=inds.end();it++){
		sort(it->y.begin(),it->y.end());
		fas[it->x].push_back(fas[it->x].size());
	}
	d=abs(cox[a]-cox[b])+abs(coy[a]-coy[b]);
	dfs(cox[a]-coy[a],cox[a]+coy[a]);
	printf("%lld",res>>1);
	return 0;
}

Measured memory_bytes: 61312