#include <ctype.h>
#include <stdio.h>
#include <algorithm>
#define delta(x, y) ((x)<(y)?(y)-(x):(x)-(y))
#define meow(args...) fprintf(stderr, args)
int F() {
	register int a, b, c;
	while(c=getchar(), !isdigit(c) & c!='-');
	b = c=='-';
	for(a=b?0:c-'0'; isdigit(c=getchar()); a=a*10+c-'0');
	return b?-a:a;
}
const int N=1e5, S=1<<19, E=N*70+S*2;
struct P {
	int x, y, s, d;
	struct cmps {bool operator()(register P *a, register P *b) const {return a->s<b->s || a->s==b->s && a->x<b->x;}};
	struct cmpd {bool operator()(register P *a, register P *b) const {return a->d<b->d || a->d==b->d && a->x<b->x;}};
};
struct queue {
	int v[N+S], head, tail;
	queue(): head(0), tail(0) {}
	bool empty() const {return head==tail;}
	int top() const {return v[head];}
	void pop() {++head;}
	void push(register int x) {v[tail++]=x;}
};
bool vis[N+S];
int n, cnt, head[N+S], to[E], next[E], w[N+S];
P p[N], *ps[N], *pd[N];
queue q;
void connect(register int x, register int y) {
//	meow("connect %d: %d->%d\n", cnt, x, y);
	to[cnt]=y, next[cnt]=head[x], head[x]=cnt++;
}
namespace SegmentTree {
	P **ptr;
	int ql, qr, qv;
	void _build(register int i, register int l, register int r) {
		head[n+i]=-1;
		if(l==r) {
			connect(n+i, ptr[l]-p);
		} else {
			register int m=(l+r)>>1;
			_build(i<<1, l, m);
			_build(i<<1|1, m+1, r);
			connect(n+i, n+(i<<1));
			connect(n+i, n+(i<<1|1));
		}
	}
	void _cover(register int i, register int l, register int r) {
		if(l>qr || r<ql) return;
		if(ql<=l && r<=qr) return connect(qv, n+i);
		register int m=(l+r)>>1;
		_cover(i<<1, l, m);
		_cover(i<<1|1, m+1, r);
	}
}
void build(P *p[], register int i) {
	using namespace SegmentTree;
	ptr=p;
	_build(i, 0, n-1);
}
void cover(register int from, register int i, register int l, register int r) {
	using namespace SegmentTree;
	ql=l, qr=r, qv=from;
	_cover(i, 0, n-1);
}
int lb(register P *ptr[], register int l, register int r, register int v, register int P::*field) {
	register int mid;
	while(l<r) ptr[mid=(l+r)>>1]->*field>=v?(r=mid):(l=mid+1);
	return l;
}
int ub(register P *ptr[], register int l, register int r, register int v, register int P::*field) {
	register int mid;
	while(l<r) ptr[mid=(l+r)>>1]->*field> v?(r=mid):(l=mid+1);
	return l;
}
int main() {
	register int a, b, r, i, j;
	register long long ans=0;
	n=F(), a=F()-1, b=F()-1;
	for(i=0; i<n; ++i) {
		register int x=F(), y=F();
		p[i]=(P){x, y, x+y, x-y};
		ps[i]=pd[i]=&p[i];
		head[i]=-1;
	}
	r=delta(p[a].x, p[b].x)+delta(p[a].y, p[b].y);
	std::sort(ps, ps+n, P::cmps());
	std::sort(pd, pd+n, P::cmpd());
	build(ps, 2);
	build(pd, 3);
	for(register int qv=0, ql, qr; qv<n; ++qv) {
		//(x[qv], y[qv]+r)->(x[qv]+r, y[qv])
		i =lb(ps, 0, n, p[qv].s+r, &P::s);
		j =ub(ps, 0, n, p[qv].s+r, &P::s);
		ql=lb(ps, i, j, p[qv].x  , &P::x);
		qr=lb(ps, i, j, p[qv].x+r, &P::x);
		w[qv]+=qr-ql;
		cover(qv, 2, ql, qr-1);
		//(x[qv]+r, y[qv])->(x[qv], y[qv]-r)
		i =lb(pd, 0, n, p[qv].d+r, &P::d);
		j =ub(pd, 0, n, p[qv].d+r, &P::d);
		ql=ub(pd, i, j, p[qv].x  , &P::x);
		qr=ub(pd, i, j, p[qv].x+r, &P::x);
		w[qv]+=qr-ql;
		cover(qv, 3, ql, qr-1);
		//(x[qv], y[qv]-r)->(x[qv]-r, y[qv])
		i =lb(ps, 0, n, p[qv].s-r, &P::s);
		j =ub(ps, 0, n, p[qv].s-r, &P::s);
		ql=ub(ps, i, j, p[qv].x-r, &P::x);
		qr=ub(ps, i, j, p[qv].x  , &P::x);
		w[qv]+=qr-ql;
		cover(qv, 2, ql, qr-1);
		//(x[qv]-r, y[qv])->(x[qv], y[qv]+r)
		i =lb(pd, 0, n, p[qv].d-r, &P::d);
		j =ub(pd, 0, n, p[qv].d-r, &P::d);
		ql=lb(pd, i, j, p[qv].x-r, &P::x);
		qr=lb(pd, i, j, p[qv].x  , &P::x);
		w[qv]+=qr-ql;
		cover(qv, 3, ql, qr-1);
	}
	q.push(a), vis[a]=1;
	q.push(b), vis[b]=1;
	while(!q.empty()) {
		i=q.top();
		q.pop();
		ans+=w[i];
		for(j=head[i]; ~j; j=next[j]) if(!vis[to[j]]) q.push(to[j]), vis[to[j]]=1;
	}
	printf("%lld\n", ans/2);
	return 0;
}

Measured memory_bytes: 32256