#include <algorithm>  
#include <iostream>  
#include <sstream>  
#include <string>  
#include <cstring>
#include <vector>  
#include <queue>  
#include <set>  
#include <map>  
#include <cstdio>  
#include <cstdlib>  
#include <cctype>  
#include <cmath>  
#include <list>  
#include <cassert>
#include <ctime>
#include <climits>
using namespace std;  

#define PB push_back  
#define MP make_pair  
#define SZ(v) ((int)(v).size())  
#define FOR(i,a,b) for(int i=(a);i<(b);++i)  
#define REP(i,n) FOR(i,0,n)  
#define FORE(i,a,b) for(int i=(a);i<=(b);++i)  
#define REPE(i,n) FORE(i,0,n)  
#define FORSZ(i,a,v) FOR(i,a,SZ(v))  
#define REPSZ(i,v) REP(i,SZ(v))  
typedef long long ll;
typedef unsigned long long ull;
ll gcd(ll a,ll b) { return b==0?a:gcd(b,a%b); }

const int MAXN = 100000;

int n, sa, sb;
int x[MAXN], y[MAXN];
int d;

int allsm[MAXN], alldf[MAXN], nallsm, nalldf;

set<pair<int, int> > sm[MAXN];
set<pair<int, int> > df[MAXN];
vector<int> smx[MAXN];
vector<int> dfx[MAXN];

ll ret;
bool done[MAXN];
int q[MAXN], qhead, qtail;

void process(int all[MAXN], int nall, int val, set<pair<int, int> > f[MAXN], vector<int> g[MAXN], int lx, int hx) {
	int id = lower_bound(all, all + nall, val) - all; if (id >= nall || all[id] != val) return;
	set<pair<int, int> >::iterator at = f[id].lower_bound(MP(lx,-1));
	while (at != f[id].end() && at->first <= hx) {
		int z = at->second; if (!done[z]) q[qhead++] = z, done[z] = true;
		set<pair<int, int> >::iterator prv = at; ++at; f[id].erase(prv);
	}
	int l = lower_bound(g[id].begin(), g[id].end(), lx) - g[id].begin();
	int r = lower_bound(g[id].begin(), g[id].end(), hx + 1) - g[id].begin();
	ret += r - l;
}


void run() {
	scanf("%d%d%d", &n, &sa, &sb); --sa, --sb; REP(i, n) scanf("%d%d", &x[i], &y[i]); d = abs(x[sa] - x[sb]) + abs(y[sa] - y[sb]);
	
	REP(i, n) allsm[i] = x[i] + y[i], alldf[i] = x[i] - y[i]; sort(allsm, allsm + n); sort(alldf, alldf + n); nallsm = unique(allsm, allsm + n) - allsm; nalldf = unique(alldf, alldf + n) - alldf;
	REP(i, n) {
		int smid = lower_bound(allsm, allsm + nallsm, x[i] + y[i]) - allsm, dfid = lower_bound(alldf, alldf + nalldf, x[i] - y[i]) - alldf;
		sm[smid].insert(MP(x[i], i)); df[dfid].insert(MP(x[i], i));
		smx[smid].PB(x[i]); dfx[dfid].PB(x[i]);
	}
	REP(i, nallsm) sort(smx[i].begin(), smx[i].end()); REP(i, nalldf) sort(dfx[i].begin(), dfx[i].end());
	//REP(i, nallsm) { printf("sm%d=%d:", i, allsm[i]); for (set<pair<int, int> >::iterator it = sm[i].begin(); it != sm[i].end(); ++it) printf(" %d=%d", it->first, it->second); puts(""); }
	//REP(i, nalldf) { printf("df%d=%d:", i, alldf[i]); for (set<pair<int, int> >::iterator it = df[i].begin(); it != df[i].end(); ++it) printf(" %d=%d", it->first, it->second); puts(""); }

	REP(i, n) done[i] = false; ret = 0; qhead = qtail = 0;
	q[qhead++] = sa, done[sa] = true; q[qhead++] = sb, done[sb] = true;
	while (qtail < qhead) {
		int z = q[qtail++];
		process(allsm, nallsm, x[z] + y[z] - d, sm, smx, x[z] - d, x[z] - 1);
		process(alldf, nalldf, x[z] - y[z] + d, df, dfx, x[z], x[z] + d - 1);
		process(allsm, nallsm, x[z] + y[z] + d, sm, smx, x[z] + 1, x[z] + d);
		process(alldf, nalldf, x[z] - y[z] - d, df, dfx, x[z] - d + 1, x[z]);
	}
	assert(ret % 2 == 0);
	printf("%lld\n", ret / 2);
}


int main() {
	run();
	return 0;
}


Measured memory_bytes: 31104