#pragma warning(disable:4996)

#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <cmath>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <complex>
#include <iterator>
#include <random>
#include <time.h>
#include <tuple>
#include <functional>
#include <list>
#include <limits.h>
using namespace std;

typedef pair<int, int> pii;
typedef long long ll;

int N, a, b;
struct Point {
	int x, y, id;
	Point(){}
	Point(int x_, int y_, int id_) {x=x_,y=y_,id=id_;}
	bool operator <(const Point &i) const {
		return x < i.x || (x == i.x && y < i.y);
	}
};
vector<Point> P;
set<Point> S, T;
queue<Point> q;
map<int, int> chk;
int D;
ll ans;
vector<pii> A, B;

int edge(int f, int l, int r, vector<pii> &X) {
	int s = 0, e = (int)X.size() - 1;
	int idx1 = -1;
	while(s <= e) {
		int m = (s + e)>>1;

		if(pii(f, l) <= X[m]) idx1 = m, e = m - 1;
		else s = m + 1;
	}
	if(idx1 == -1 || pii(f, r) < X[idx1]) return 0;
	s = 0, e = (int)X.size() - 1;
	int idx2 = -1;
	while(s <= e) {
		int m = (s + e)>>1;

		if(pii(f, r) >= X[m]) idx2 = m, s = m + 1;
		else e = m - 1;
	}
	return idx2 - idx1 + 1;
}

int main() {
	scanf("%d %d %d", &N, &a, &b);
	a--; b--;
	P.resize(N);
	for(int i = 0; i < N; i++) {
		scanf("%d %d", &P[i].x, &P[i].y);
		S.insert(Point(P[i].x + P[i].y, P[i].x - P[i].y, i));
		T.insert(Point(P[i].x - P[i].y, P[i].x + P[i].y, i));
		A.push_back(pii(P[i].x + P[i].y, P[i].x - P[i].y));
		B.push_back(pii(P[i].x - P[i].y, P[i].x + P[i].y));
	}
	sort(A.begin(), A.end());
	sort(B.begin(), B.end());

	q.push(P[a]); chk[a] = 1;
	D = abs(P[a].x - P[b].x) + abs(P[a].y - P[b].y);
	
	ans = 0;
	while(!q.empty()) {
		Point u = q.front(); q.pop();

		if(1) {
			int f = u.x + u.y + D, l = u.x - u.y - D, r = u.x - u.y + D;
			ans += edge(f, l, r, A);
			while(1) {
				set<Point>::iterator it = S.lower_bound(Point(f, l, 0));
				if(it == S.end() || it->x != f || it->y > r) break;
				int x = (it->x + it->y)/2;
				int y = (it->x - it->y)/2;
				if(!chk[it->id]) {
					q.push(Point(x, y, it->id));
					chk[it->id] = 1;
				}
				S.erase(it);
			}
		}
		if(2) {
			int f = u.x + u.y - D, l = u.x - u.y - D, r = u.x - u.y + D;
			ans += edge(f, l, r, A);
			while(1) {
				set<Point>::iterator it = S.lower_bound(Point(f, l, 0));
				if(it == S.end() || it->x != f || it->y > r) break;
				int x = (it->x + it->y)/2;
				int y = (it->x - it->y)/2;
				if(!chk[it->id]) {
					q.push(Point(x, y, it->id));
					chk[it->id] = 1;
				}
				S.erase(it);
			}
		}
		if(3) {
			int f = u.x - u.y + D, l = u.x + u.y - D + 1, r = u.x + u.y + D - 1;
			ans += edge(f, l, r, B);
			while(1) {
				set<Point>::iterator it = T.lower_bound(Point(f, l, 0));
				if(it == T.end() || it->x != f || it->y > r) break;
				int x = (it->x + it->y)/2;
				int y = (it->y - it->x)/2;
				if(!chk[it->id]) {
					q.push(Point(x, y, it->id));
					chk[it->id] = 1;
				}
				T.erase(it);
			}
		}
		if(4) {
			int f = u.x - u.y - D, l = u.x + u.y - D + 1, r = u.x + u.y + D - 1;
			ans += edge(f, l, r, B);
			while(1) {
				set<Point>::iterator it = T.lower_bound(Point(f, l, 0));
				if(it == T.end() || it->x != f || it->y > r) break;
				int x = (it->x + it->y)/2;
				int y = (it->y - it->x)/2;
				if(!chk[it->id]) {
					q.push(Point(x, y, it->id));
					chk[it->id] = 1;
				}
				T.erase(it);
			}
		}
	}
	cout<<ans/2;
}

Measured memory_bytes: 17000