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

#define sz(x) (int)x.size() 
#define pb push_back 
#define mp make_pair 
#define fi(a, b) for(int i=a; i<=b; i++) 
#define fj(a, b) for(int j=a; j<=b; j++) 
#define fo(a, b) for(int o=a; o<=b; o++) 
#define fdi(a, b) for(int i=a; i>=b; i--) 
#define fdj(a, b) for(int j=a; j>=b; j--) 
#define fdo(a, b) for(int o=a; o>=b; o--) 

#ifdef LOCAL
#define err(...) fprintf(stderr, __VA_ARGS__)
#else
#define err(...) while(false) {}
#endif

typedef long long ll; 
typedef pair<int, int> pii; 
typedef pair<ll, ll> pll; 
typedef vector<int> vi; 
typedef vector<pii> vpii; 
typedef vector<pll> vpll; 
typedef long double ld;

/////////////////////////////////

int const MAX = 1e5 + 41;
ll const INF = 1e18;

int n, a, b;
ll x[MAX];
ll y[MAX];

struct Point {
	ll x, y, id;
	Point () {}
	Point (ll x, ll y, ll id) : x(x), y(y), id(id) {};
	bool operator<(const Point &a) const {
		if (x != a.x) return x < a.x;
		if (y != a.y) return y < a.y;
		return id < a.id;
	};
};

vi e[MAX];
ll ans;
ll d;

void buildedges() {
	vector<Point> v;
	fi(1, n) {
		v.pb(Point(x[i], y[i], i));
	}
	sort(v.begin(), v.end());
	vi q(sz(v), 0);
	fi(0, sz(v) - 1) {
		vector<Point> :: iterator l = lower_bound(v.begin(), v.end(), Point(v[i].x - d, v[i].y - d, -INF));						
		if (l->x != v[i].x - d) continue;
		if (l->y > v[i].y + d) continue;
		vector<Point> :: iterator r = upper_bound(v.begin(), v.end(), Point(v[i].x - d, v[i].y + d, INF));
		assert(r != v.begin());
		r--;
		q[(l - v.begin())]++;
		q[(r - v.begin())]--;
		int a = v[(l - v.begin())].id;
		e[a].pb(v[i].id);
		e[v[i].id].pb(a);
	}
	fi(0, sz(v) - 1) {
		vector<Point> :: iterator l = lower_bound(v.begin(), v.end(), Point(v[i].x + d, v[i].y - d, -INF));						
		if (l->x != v[i].x + d) continue;
		if (l->y > v[i].y + d) continue;
		vector<Point> :: iterator r = upper_bound(v.begin(), v.end(), Point(v[i].x + d, v[i].y + d, INF));
		assert(r != v.begin());
		r--;
		q[(l - v.begin())]++;
		q[(r - v.begin())]--;
		int a = v[(l - v.begin())].id;
		e[a].pb(v[i].id);
		e[v[i].id].pb(a);
	}
	int b = 0;
	fi(0, sz(v) - 1) {
		b += q[i];
		if (b > 0) {
			assert(i + 1 < sz(v));
			int x = v[i].id;
			int y = v[i + 1].id;
			e[x].pb(y);
			e[y].pb(x);
		}
	}
}

int u[MAX];
vector<Point> v;

void dfs(int x) {
	v.pb(Point(::x[x], y[x], x));
	u[x] = 1;
	for (int y : e[x]) {
		if (u[y]) continue;
		dfs(y);
	}
}

void calc() {
	sort(v.begin(), v.end());
	fi(0, sz(v) - 1) {
		vector<Point> :: iterator l = lower_bound(v.begin(), v.end(), Point(v[i].x - d, v[i].y - d, -INF));
		if (l->x != v[i].x - d) continue;
		if (l->y > v[i].y + d) continue;
		vector<Point> :: iterator r = upper_bound(v.begin(), v.end(), Point(v[i].x - d, v[i].y + d, INF));
		ans += (int)(r - l);
		err("i = %lld val = %d\n", v[i].id, (int)(r - l));
	}
	fi(0, sz(v) - 1) {
		vector<Point> :: iterator l = lower_bound(v.begin(), v.end(), Point(v[i].x + d, v[i].y - d, -INF));
		if (l->x != v[i].x + d) continue;
		if (l->y > v[i].y + d) continue;
		vector<Point> :: iterator r = upper_bound(v.begin(), v.end(), Point(v[i].x + d, v[i].y + d, INF));
		ans += (int)(r - l);
		err("i = %lld val = %d\n", v[i].id, (int)(r - l));
	}
	fi(0, sz(v) - 1) {
		swap(v[i].x, v[i].y);
	}
	sort(v.begin(), v.end());
	fi(0, sz(v) - 1) {
		vector<Point> :: iterator l = lower_bound(v.begin(), v.end(), Point(v[i].x - d, v[i].y - d + 1, -INF));
		if (l->x != v[i].x - d) continue;
		if (l->y > v[i].y + d - 1) continue;
		vector<Point> :: iterator r = upper_bound(v.begin(), v.end(), Point(v[i].x - d, v[i].y + d - 1, INF));
		ans += (int)(r - l);
		err("i = %lld val = %d\n", v[i].id, (int)(r - l));
	}
	fi(0, sz(v) - 1) {
		vector<Point> :: iterator l = lower_bound(v.begin(), v.end(), Point(v[i].x + d, v[i].y - d + 1, -INF));
		if (l->x != v[i].x + d) continue;
		if (l->y > v[i].y + d - 1) continue;
		vector<Point> :: iterator r = upper_bound(v.begin(), v.end(), Point(v[i].x + d, v[i].y + d - 1, INF));
		ans += (int)(r - l);
		err("i = %lld val = %d\n", v[i].id, (int)(r - l));
	}
}

void solve() {	
	d = abs(x[a] - x[b]) + abs(y[a] - y[b]);
	fi(1, n) {
		ll x1 = x[i] + y[i];
		ll y1 = x[i] - y[i];
		x[i] = x1;
		y[i] = y1;
	}
	buildedges();
	fi(1, n) {
		swap(x[i], y[i]);
	}
	buildedges();
	fi(1, n) {
		swap(x[i], y[i]);
	}
	dfs(a);
	for (Point z : v) {
		err("x = %lld y = %lld id = %lld\n", z.x, z.y, z.id);
	}	
	calc();
	assert(ans % 2 == 0);
	ans /= 2;
	printf("%lld\n", ans);
}

int main() {
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

	scanf("%d %d %d", &n, &a, &b);
	fi(1, n) {
		scanf("%lld %lld", &x[i], &y[i]);
	}  
	solve();		

	
#ifdef LOCAL
	err("ELAPSED TIME: %.3Lf\n", (ld) clock() / CLOCKS_PER_SEC);
#endif	
	
	return 0;
}

Measured memory_bytes: 24648