#include <algorithm>
#include <cstdio>
#include <map>
#include <queue>
#include <set>
#include <vector>

using namespace std;

const int maxn = 1e5 + 10;

struct Point
{
	int x, y, id;
	Point(int x = 0) : x(x) {}
	bool operator<(const Point &rhs) const { return x < rhs.x; }
};

map<int, set<Point>> add, sub;
map<int, vector<Point>> addv, subv;

bool vis[maxn];
Point p[maxn];

int main()
{
	int N, a, b;
	scanf("%d %d %d", &N, &a, &b);
	for (int i = 1; i <= N; ++i)
	{
		scanf("%d %d", &p[i].x, &p[i].y);
		p[i].id = i;
		addv[p[i].x + p[i].y].push_back(p[i]);
		subv[p[i].x - p[i].y].push_back(p[i]);
	}
	for (auto &p : addv)
	{
		sort(p.second.begin(), p.second.end());
		add[p.first] = set<Point>(p.second.begin(), p.second.end());
	}
	for (auto &p : subv)
	{
		sort(p.second.begin(), p.second.end());
		sub[p.first] = set<Point>(p.second.begin(), p.second.end());
	}
	int d = abs(p[a].x - p[b].x) + abs(p[a].y - p[b].y);
	queue<int> q;
	q.push(a);
	q.push(b);
	vis[a] = vis[b] = true;
	long long ans = 0;
	while (!q.empty())
	{
		int i = q.front();
		int x = p[i].x;
		int y = p[i].y;
		q.pop();
		vector<int> nxt;
		{
			int t = x - d - y;
			int l = x - d;
			int r = x;
			auto st = sub[t].lower_bound(Point(l));
			auto ed = sub[t].lower_bound(Point(r));
			for (auto it = st; it != ed; ++it)
				nxt.push_back(it->id);
			ans += lower_bound(subv[t].begin(), subv[t].end(), Point(r)) -
				   lower_bound(subv[t].begin(), subv[t].end(), Point(l));
		}
		{
			int t = x + d - y;
			int l = x + 1;
			int r = x + d + 1;
			auto st = sub[t].lower_bound(Point(l));
			auto ed = sub[t].lower_bound(Point(r));
			for (auto it = st; it != ed; ++it)
				nxt.push_back(it->id);
			ans += lower_bound(subv[t].begin(), subv[t].end(), Point(r)) -
				   lower_bound(subv[t].begin(), subv[t].end(), Point(l));
		}
		{
			int t = x + y - d;
			int l = x - d + 1;
			int r = x + 1;
			auto st = add[t].lower_bound(Point(l));
			auto ed = add[t].lower_bound(Point(r));
			for (auto it = st; it != ed; ++it)
				nxt.push_back(it->id);
			ans += lower_bound(addv[t].begin(), addv[t].end(), Point(r)) -
				   lower_bound(addv[t].begin(), addv[t].end(), Point(l));
		}
		{
			int t = x + y + d;
			int l = x;
			int r = x + d;
			auto st = add[t].lower_bound(Point(l));
			auto ed = add[t].lower_bound(Point(r));
			for (auto it = st; it != ed; ++it)
				nxt.push_back(it->id);
			ans += lower_bound(addv[t].begin(), addv[t].end(), Point(r)) -
				   lower_bound(addv[t].begin(), addv[t].end(), Point(l));
		}
		for (int j : nxt)
		{
			if (vis[j])
				continue;
			q.push(j);
			int x = p[j].x, y = p[j].y;
			add[x + y].erase(p[j]);
			sub[x - y].erase(p[j]);
		}
	}
	printf("%lld\n", ans / 2);
	return 0;
}
