#include <bits/stdc++.h>
using namespace std;

#define INF_LL (int64)1e18
#define INF (int32)1e9
#define REP(i, n) for(int64 i = 0;i < (n);i++)
#define FOR(i, a, b) for(int64 i = (a);i < (b);i++)
#define all(x) x.begin(),x.end()
#define fs first
#define sc second

using int32 = int_fast32_t;
using uint32 = uint_fast32_t;
using int64 = int_fast64_t;
using uint64 = uint_fast64_t;
using PII = pair<int32, int32>;
using PLL = pair<int64, int64>;

const double eps = 1e-10;

template<typename A, typename B>inline void chmin(A &a, B b){if(a > b) a = b;}
template<typename A, typename B>inline void chmax(A &a, B b){if(a < b) a = b;}

int32 N;
map<int64, bool> tx, ty;
map<int64, int32> zipx, zipy;
map<PLL, bool> visited;
map<int64, int32> mapx[100010], mapy[100010];
set<int64> sx[100010], sy[100010];
vector<int64> X, Y, zX, zY;

int64 res = 0;
int32 a, b;
int64 dis;

void tozip(const vector<int64> v, vector<int64>& zv, map<int64, int32>& mv){
	vector<int64> zip = v;
	sort(all(zip));
	zip.erase(unique(all(zip)), zip.end());
	REP(i, zip.size()){
		mv[zip[i]] = i;
	}
	zv.resize(v.size());
	REP(i, v.size()){
		zv[i] = mv[v[i]];
	}
}

void dfs(int64 x, int64 y){
	if(sx[zipx[x]].find(y) == sx[zipx[x]].end()) return;
	sx[zipx[x]].erase(y);
	sy[zipy[y]].erase(x);


	auto f = mapx[zipx[x-dis]].lower_bound(y-dis), s = mapx[zipx[x-dis]].upper_bound(y+dis);
	if(tx[x-dis]){
		res += s->second-f->second;
	}
	f = mapx[zipx[x+dis]].lower_bound(y-dis), s = mapx[zipx[x+dis]].upper_bound(y+dis);
	if(tx[x+dis]){
		res += s->second-f->second;
	}
	f = mapy[zipy[y+dis]].lower_bound(x-dis+1), s = mapy[zipy[y+dis]].upper_bound(x+dis-1);
	if(ty[y+dis]){
		res += s->second-f->second;
	}
	f = mapy[zipy[y-dis]].lower_bound(x-dis+1), s = mapy[zipy[y-dis]].upper_bound(x+dis-1);
	if(ty[y-dis]){
		res += s->second-f->second;
	}

	while(tx[x-dis] && sx[zipx[x-dis]].lower_bound(y-dis) != sx[zipx[x-dis]].end()){
		auto i = sx[zipx[x-dis]].lower_bound(y-dis);
		if(*i > y+dis) break;
		dfs(x-dis, *i);
	}
	while(tx[x+dis] && sx[zipx[x+dis]].lower_bound(y-dis) != sx[zipx[x+dis]].end()){
		auto i = sx[zipx[x+dis]].lower_bound(y-dis);
		if(*i > y+dis) break;
		dfs(x+dis, *i);
	}
	while(ty[y-dis] && sy[zipy[y-dis]].lower_bound(x-dis) != sy[zipy[y-dis]].end()){
		auto i = sy[zipy[y-dis]].lower_bound(x-dis);
		if(*i > x+dis) break;
		dfs(*i, y-dis);
	}
	while(ty[y+dis] && sy[zipy[y+dis]].lower_bound(x-dis) != sy[zipy[y+dis]].end()){
		auto i = sy[zipy[y+dis]].lower_bound(x-dis);
		if(*i > x+dis) break;
		dfs(*i, y+dis);
	}
}

int main(void){
	cin.tie(0);
	ios::sync_with_stdio(false);
	
	cin >> N >> a >> b; a--; b--;
	X.resize(N); Y.resize(N);
	REP(i, N){
		cin >> X[i] >> Y[i];
		int64 x, y;
		x = X[i]+Y[i];
		y = X[i]-Y[i];
		X[i] = x; Y[i] = y;
	}
	tozip(X, zX, zipx);
	tozip(Y, zY, zipy);
	REP(i, N){
		mapx[zipx[X[i]]][Y[i]] = 0;
		mapy[zipy[Y[i]]][X[i]] = 0;
		sx[zipx[X[i]]].insert(Y[i]);
		sy[zipy[Y[i]]].insert(X[i]);
		tx[X[i]] = 1;
		ty[Y[i]] = 1;
	}
	REP(i, 100010){
		int32 cnt = 1;
		for(auto& x : mapx[i]){
			x.sc = cnt++;
		}
		mapx[i][INF_LL] = cnt;
		cnt = 1;
		for(auto& x : mapy[i]){
			x.sc = cnt++;
		}
		mapy[i][INF_LL] = cnt;
	}
	dis = max(abs(X[a]-X[b]), abs(Y[a]-Y[b]));
	dfs(X[a], Y[a]);
	cout << res/2 << endl;
}


Measured memory_bytes: 107104