#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <functional>
#include <iostream>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<ll,int> P;


class data{
public:
	ll x,y,id;
	data(){}
	data(ll xx,ll yy,ll ii){
		x=xx;
		y=yy;
		id=ii;
	}
	bool operator<(const data& d)const{
		if(d.x==x)return y<d.y;
		return x<d.x;
	}
};

class data2{
public:
	ll x,y,id;
	data2(){}
	data2(ll xx,ll yy,ll ii){
		x=xx;
		y=yy;
		id=ii;
	}
	bool operator<(const data2& d)const{
		if(d.y==y)return x<d.x;
		return y<d.y;
	}
};


ll labs(ll x){
	if(x<0LL)return -x;
	return x;	
}

int n,a,b;
ll d;
ll x[100001],y[100001];
set<data> dat;
set<data2> dat2;
set<int> gr;
vector<data> gd;
vector<data2> gd2;

int dfs(int v){
	gr.insert(v);
	vector<int> vec;
	set<data>::iterator it,it2;
	if(dat.size()){
		it=dat.lower_bound(data(x[v]+d,y[v]-d,0));
		it2=dat.upper_bound(data(x[v]+d,y[v]+d,0));
		while(it!=it2 && it!=dat.end()){
			data da=*it;
			if(da.x!=x[v]+d || da.y>y[v]+d)break;
			gr.insert(da.id);
			vec.push_back(da.id);
			it++;
		}
		it=dat.lower_bound(data(x[v]-d,y[v]-d,0));
		it2=dat.upper_bound(data(x[v]-d,y[v]+d,0));
		while(it!=it2 && it!=dat.end()){
			data da=*it;
			if(da.x!=x[v]-d || da.y>y[v]+d)break;
			gr.insert(da.id);
			vec.push_back(da.id);
			it++;
		}
	}
	if(dat2.size()){
		set<data2>::iterator it3,it4;
		it3=dat2.lower_bound(data2(x[v]-d,y[v]-d,0));
		it4=dat2.upper_bound(data2(x[v]+d,y[v]-d,0));
		while(it3!=it4 && it3!=dat2.end()){
			data2 da=*it3;
			if(da.y!=y[v]-d || da.x>x[v]+d)break;
			gr.insert(da.id);
			vec.push_back(da.id);
			it3++;
		}

		it3=dat2.lower_bound(data2(x[v]-d,y[v]+d,0));
		it4=dat2.upper_bound(data2(x[v]+d,y[v]+d,0));
		while(it3!=it4 && it3!=dat2.end()){
			data2 da=*it3;
			if(da.y!=y[v]+d || da.x>x[v]+d)break;
			gr.insert(da.id);
			vec.push_back(da.id);
			it3++;
		}
	}
	for(int i=0;i<vec.size();i++){
		dat.erase(data(x[vec[i]],y[vec[i]],vec[i]));
		dat2.erase(data2(x[vec[i]],y[vec[i]],vec[i]));
	}
	for(int i=0;i<vec.size();i++){
		dfs(vec[i]);
	}
}

int main(void){
	scanf("%d%d%d",&n,&a,&b);
	a--;
	b--;
	for(int i=0;i<n;i++){
		scanf("%lld%lld",&x[i],&y[i]);
		ll v1=x[i]+y[i];
		ll v2=x[i]-y[i];
		x[i]=v1;
		y[i]=v2;
		if(i!=a){
			dat.insert(data(x[i],y[i],i));
			dat2.insert(data2(x[i],y[i],i));
		}
	}
	d=max(labs(x[a]-x[b]),labs(y[a]-y[b]));
	dfs(a);
	set<int>::iterator it=gr.begin();
	while(it!=gr.end()){
		gd.push_back(data(x[*it],y[*it],*it));
		gd2.push_back(data2(x[*it],y[*it],*it));
		it++;
	}
	ll res=0;
	sort(gd.begin(),gd.end());
	sort(gd2.begin(),gd2.end());
	it=gr.begin();
	while(it!=gr.end()){
		int v=*it;
		ll cnt=0;
		int l=lower_bound(gd.begin(),gd.end(),data(x[v]-d,y[v]-d,0))-gd.begin();
		int r=upper_bound(gd.begin(),gd.end(),data(x[v]-d,y[v]+d,0))-gd.begin();
		if(r-l>0){
			cnt+=r-l;
		}
		l=lower_bound(gd.begin(),gd.end(),data(x[v]+d,y[v]-d,0))-gd.begin();
		r=upper_bound(gd.begin(),gd.end(),data(x[v]+d,y[v]+d,0))-gd.begin();
		if(r-l>0){
			cnt+=r-l;
		}

		l=lower_bound(gd2.begin(),gd2.end(),data2(x[v]-d+1,y[v]-d,0))-gd2.begin();
		r=upper_bound(gd2.begin(),gd2.end(),data2(x[v]+d-1,y[v]-d,0))-gd2.begin();
		if(r-l>0){
			cnt+=r-l;
		}

		l=lower_bound(gd2.begin(),gd2.end(),data2(x[v]-d+1,y[v]+d,0))-gd2.begin();
		r=upper_bound(gd2.begin(),gd2.end(),data2(x[v]+d-1,y[v]+d,0))-gd2.begin();
		if(r-l>0){
			cnt+=r-l;
		}
		res+=(ll)cnt;
		*it++;
	}
	printf("%lld\n",res/2LL);
	return 0;
}


Measured memory_bytes: 27136