#include<bits/stdc++.h>
#define pb push_back
#define ins insert
#define F first
#define S second
#define var auto
#define mp make_pair
typedef long long ll;
using namespace std;

const int Max = 1e5 + 10;
const int Log = 30;
int X[Max];
int Y[Max];
vector<int> N[17 * Max];
int ans[17 * Max];

#define Seg1down(i) (i + 1 * Max)
#define Seg1up(i) 	(i + 5 * Max)
#define Seg2down(i) (i + 9 * Max)
#define Seg2up(i) 	(i + 13 * Max)

vector<pair<pair<int,int>,int> > srt1 , srt2;

void Init1(const int & tl , const int & tr , const int & idx)
{
	if(tr - tl == 1)
	{
		int vert = srt1[tl].S;
		N[Seg1down(idx)].pb(vert);
		N[vert].pb(Seg1up(idx));
		return;
	}

	N[Seg1down(idx)].pb(Seg1down(idx * 2));
	N[Seg1down(idx)].pb(Seg1down(idx * 2 + 1));
	N[Seg1up(idx * 2)].pb(Seg1up(idx));
	N[Seg1up(idx * 2 + 1)].pb(Seg1up(idx));
	int mid = (tl + tr) / 2;
	Init1(tl , mid , idx * 2);
	Init1(mid , tr , idx * 2 + 1);
}

void Init2(const int & tl , const int & tr , const int & idx)
{
	if(tr - tl == 1)
	{
		int vert = srt2[tl].S;
		N[Seg2down(idx)].pb(vert);
		N[vert].pb(Seg2up(idx));
		return;
	}

	N[Seg2down(idx)].pb(Seg2down(idx * 2));
	N[Seg2down(idx)].pb(Seg2down(idx * 2 + 1));
	N[Seg2up(idx * 2)].pb(Seg2up(idx));
	N[Seg2up(idx * 2 + 1)].pb(Seg2up(idx));
	int mid = (tl + tr) / 2;
	Init2(tl , mid , idx * 2);
	Init2(mid , tr , idx * 2 + 1);
}


void Connect1(const int & v , const int & l ,const int & r , const int & tl ,const int & tr ,const int & idx)
{
	if(tl > r || tr <= l)
		return;
	if(l <= tl && tr-1 <= r)
	{
		N[v].pb(Seg1down(idx));
		N[Seg1up(idx)].pb(v);
		return;
	}

	int mid = (tl + tr) / 2;
	Connect1(v , l , r , tl , mid , idx * 2);
	Connect1(v , l , r , mid , tr , idx * 2 + 1);
}


void Connect2(const int & v , const int & l ,const int & r , const int & tl ,const int & tr ,const int & idx)
{
	if(tl > r || tr <= l)
		return;
	if(l <= tl && tr-1 <= r)
	{
		N[v].pb(Seg2down(idx));
		N[Seg2up(idx)].pb(v);
		return;
	}

	int mid = (tl + tr) / 2;
	Connect2(v , l , r , tl , mid , idx * 2);
	Connect2(v , l , r , mid , tr , idx * 2 + 1);
}

bool seen[17 * Max];

ll DFS(int v)
{
	/*if(v < Max)
		cout << v << " * ";*/
	seen[v] = true;

	ll res = ans[v];
	for(var u : N[v])
	{
		if(!seen[u])
			res += DFS(u);
	}
	return res;
}

int main()
{
	int n , a , b; cin >> n >> a >> b;
	a--,b--;

	for(int i = 0; i < n ; i++)
	{
		cin >> X[i] >> Y[i];
		srt1.pb({{X[i] + Y[i] , X[i]} , i});
		srt2.pb({{X[i] - Y[i] , X[i]} , i});
	}
	int d = abs(X[a] - X[b]) + abs(Y[a] - Y[b]);
	sort(srt1.begin() , srt1.end());
	sort(srt2.begin() , srt2.end());

	Init1(0 , n , 1);
	Init2(0 , n , 1);
	//cout << '\n';
	for(int i = 0; i < n ; i++)
	{
		int x = X[i] , y = Y[i];
		int mnX = x - d;
		int mxX = x;

		{
			int first = lower_bound(srt1.begin() , srt1.end() , mp(mp(x + y - d,mnX),-1)) - srt1.begin();
			int last = lower_bound(srt1.begin() , srt1.end() , mp(mp(x + y - d,mxX),Max)) - srt1.begin();
			last--;
			if(first < n && last >= first)
			{
				/*cout << i << " => ";
				for(int i = first ; i <= last ; i++)
					cout << srt1[i].S << " ";
				cout << '\n';*/
				Connect1(i , first , last , 0 , n , 1);
				ans[i] = last - first + 1;
			}
		}

		{
			mnX++;
			mxX--;
			int first = lower_bound(srt2.begin() , srt2.end() , mp(mp(x - y - d,mnX),-1)) - srt2.begin();
			int last = lower_bound(srt2.begin() , srt2.end() , mp(mp(x - y - d,mxX),Max)) - srt2.begin();
			last--;
			if(first < n && last >= first)
			{
				/*cout << i << " => ";
				for(int i = first ; i <= last ; i++)
					cout << srt2[i].S << " ";
				cout << '\n';*/

				Connect2(i , first , last , 0 , n , 1);
				ans[i] += last - first + 1;
			}
		}
	}

	/*cout << '\n';
	for(int i = 0; i < n ; i++)
		cout << ans[i] << " ";
	cout << '\n';*/
	cout <<'\n' <<DFS(a) << '\n';
}



Measured memory_bytes: 99064