#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
using namespace std;

#pragma warning(disable:4996)
//FILE *in = freopen("in1.txt", "r", stdin);

set<pair<long long, long long>> s[200000], t[200000]; long long n, a, b, x[100000], y[100000]; bool used[100000]; vector<long long>X, Y, ZX[200000], ZY[200000];
queue<long long>Q; int cnt = 0;
void Delete(long long p, long long q) {
	long long pos1 = lower_bound(X.begin(), X.end(), x[p]) - X.begin();
	long long pos2 = lower_bound(Y.begin(), Y.end(), y[p]) - Y.begin();
	if (q == 0)s[pos1].erase(make_pair(y[p], p));
	if (q == 1)t[pos2].erase(make_pair(x[p], p));
}
long long findx(long long pos, long long L, long long R) {
	long long pos1 = lower_bound(X.begin(), X.end(), pos) - X.begin();
	if (pos1 == X.size() || X[pos1] != pos)return 0;
	long long pos2 = lower_bound(ZX[pos1].begin(), ZX[pos1].end(), L) - ZX[pos1].begin();
	long long pos3 = lower_bound(ZX[pos1].begin(), ZX[pos1].end(), R + 1) - ZX[pos1].begin();
	return pos3 - pos2;
}
long long findy(long long pos, long long L, long long R) {
	long long pos1 = lower_bound(Y.begin(), Y.end(), pos) - Y.begin();
	if (pos1 == Y.size() || Y[pos1] != pos)return 0;
	long long pos2 = lower_bound(ZY[pos1].begin(), ZY[pos1].end(), L) - ZY[pos1].begin();
	long long pos3 = lower_bound(ZY[pos1].begin(), ZY[pos1].end(), R + 1) - ZY[pos1].begin();
	return pos3 - pos2;
}
void iteratex(long long pos, long long L, long long R) {
	long long pos1 = lower_bound(X.begin(), X.end(), pos) - X.begin();
	if (pos1 == X.size() || X[pos1] != pos)return;
	auto itr = s[pos1].lower_bound(make_pair(L, 0LL));
	while (s[pos1].size() >= 1 && (itr != s[pos1].end()) && (*itr).first <= R) {
		used[(*itr).second] = true; Q.push((*itr).second);
		Delete((*itr).second, 1);
		itr = s[pos1].erase(itr);
	}
}
void iteratey(long long pos, long long L, long long R) {
	long long pos1 = lower_bound(Y.begin(), Y.end(), pos) - Y.begin();
	if (pos1 == Y.size() || Y[pos1] != pos)return;
	auto itr = t[pos1].lower_bound(make_pair(L, 0LL));
	while (t[pos1].size() >= 1 && itr != t[pos1].end() && (*itr).first <= R) {
		used[(*itr).second] = true; Q.push((*itr).second);
		Delete((*itr).second, 0);
		itr = t[pos1].erase(itr);
	}
}
int main() {
	cin >> n >> a >> b; a--; b--;
	for (long long i = 0; i < n; i++) {
		cin >> x[i] >> y[i];
		long long U1 = x[i] - y[i], U2 = x[i] + y[i];
		x[i] = U1; y[i] = U2;
		X.push_back(U1); Y.push_back(U2);
	}
	long long B = max(abs(x[a] - x[b]), abs(y[a] - y[b]));
	sort(X.begin(), X.end()); X.erase(unique(X.begin(), X.end()), X.end());
	sort(Y.begin(), Y.end()); Y.erase(unique(Y.begin(), Y.end()), Y.end());
	for (long long i = 0; i < n; i++) {
		long long pos1 = lower_bound(X.begin(), X.end(), x[i]) - X.begin();
		long long pos2 = lower_bound(Y.begin(), Y.end(), y[i]) - Y.begin();
		s[pos1].insert(make_pair(y[i], i));
		t[pos2].insert(make_pair(x[i], i));
		ZX[pos1].push_back(y[i]);
		ZY[pos2].push_back(x[i]);
	}
	for (int i = 0; i < n; i++) {
		sort(ZX[i].begin(), ZX[i].end());
		sort(ZY[i].begin(), ZY[i].end());
	}
	Q.push(a); Q.push(b); used[a] = true; used[b] = true; Delete(a, 0); Delete(a, 1); Delete(b, 0); Delete(b, 1);
	while (!Q.empty()) {
		long long a1 = Q.front(); Q.pop(); cnt++;
		iteratex(x[a1] - B, y[a1] - B, y[a1] + B);
		iteratex(x[a1] + B, y[a1] - B, y[a1] + B);
		iteratey(y[a1] - B, x[a1] - B, x[a1] + B);
		iteratey(y[a1] + B, x[a1] - B, x[a1] + B);
	}
	long long ret = 0;
	for (long long i = 0; i < n; i++) {
		if (used[i] == false)continue;
		ret += findx(x[i] - B, y[i] - B, y[i] + B);
		ret += findx(x[i] + B, y[i] - B, y[i] + B);
		ret += findy(y[i] - B, x[i] - B + 1, x[i] + B - 1);
		ret += findy(y[i] + B, x[i] - B + 1, x[i] + B - 1);
	}
	cout << ret / 2 << endl;
	//cout << "end" << endl;
	return 0;
}

Measured memory_bytes: 49516