#include "bits/stdc++.h"

using namespace std;

#define DEBUG(x) cerr<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cerr<<#v<<":";for(int i=0;i<v.size();i++) cerr<<" "<<v[i]; cerr<<endl

typedef long long ll;
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
template<class S, class T> pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first + t.first, s.second + t.second); }
template<class S, class T> pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first - t.first, s.second - t.second); }
template<class S, class T> ostream& operator<<(ostream& os, pair<S, T> p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
#define X first
#define Y second
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define rep1(i,n) for(ll i=1;i<=(ll)(n);i++)
#define rrep(i,n) for(ll i=(ll)(n)-1;i>=0;i--)
#define rrep1(i,n) for(ll i=(ll)(n);i>0;i--)
#define REP(i,a,b) for(ll i=(ll)a;i<(ll)b;i++)
#define in(x, a, b) (a <= x && x < b)
#define all(c) c.begin(),c.end()
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a = b; return 1; } return 0; }
#define UNIQUE(v) v.erase(std::unique(v.begin(), v.end()), v.end());
const ll inf = 1000000001;
const ll INF = 2e18;
const ll MOD = 1000000007;
const double pi = 3.14159265358979323846;
#define Sp(p) cout<<setprecision(15)<< fixed<<p<<endl;
int dx[4] = { 1,0, -1,0 }, dy[4] = { 0,1,0,-1 };
int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };
#define fio() cin.tie(0); ios::sync_with_stdio(false);


class UnionFind {
public:
	int n;
	vi par; //親
	vi ran; //木の深さ
	vi num; //要素数

	UnionFind(int _n) {
		n = _n;
		par.resize(n); ran.resize(n); num.resize(n);
		for (int i = 0; i < n; i++) {
			par[i] = i; ran[i] = 0; num[i] = 1;
		}
	}

	//木の根を求める
	int find(int x) {
		if (par[x] == x) {
			return x;
		}
		else {
			return par[x] = find(par[x]);
		}
	}

	//xとyの属する集合を併合
	void unite(int x, int y) {
		x = find(x); y = find(y);
		int numsum = num[x] + num[y];
		if (x == y) {
			return;
		}
		if (ran[x]<ran[y]) {
			par[x] = y;
		}
		else {
			par[y] = x;
			if (ran[x] == ran[y]) {
				ran[x]++;
			}
		}
		num[x] = num[y] = numsum;
	}

	//xとyが同じ集合に属するか否か
	bool same(int x, int y) {
		return find(x) == find(y);
	}

};


#define mp make_pair

int main () {
  int n, a, b;
  cin >> n >> a >> b;
  a--; b--;
  vector<vector<pair<pll, int> > > xy(2, vector<pair<pll, int> > (n));
  set<pll> st;
  rep (i, n) {
    ll x, y;
    cin >> x >> y;
    ll x2 = x + y, y2 = x - y;
    st.insert(pll(x2, y2));
    xy[0][i] = make_pair(pll(x2, y2), i);
    xy[1][i] = mp(pll(y2, x2), i);
  }
  ll d = max(abs(xy[0][a].first.first - xy[0][b].first.first), abs(xy[0][a].first.second - xy[0][b].first.second));
  
  
  sort(all(xy[0]));
  sort(all(xy[1]));
  UnionFind uf(n);
  ll prex = -INF;
  int prei = -1;
  rep (i, 2) {
    rep (j, n) {
      ll x = xy[i][j].first.first, y = xy[i][j].first.second;
      int idx = xy[i][j].second;
      if (x != prex) {
        auto itr1 = lower_bound(xy[i].begin(), xy[i].end(), mp(pll(x + d, y - d), (int)-1));
        auto itr2 = lower_bound(xy[i].begin(), xy[i].end(), mp(pll(x + d, y + d), (int)inf));
        for (auto itr = itr1; itr != itr2; itr++) {
          uf.unite(idx, itr->second);
        }
        prex = x;
        prei = itr2 - xy[i].begin() - 1;
      }
      else {
        auto itr1 = lower_bound(all(xy[i]), mp(pll(x + d, y - d), (int)-1));
        auto itr2 = lower_bound(all(xy[i]), mp(pll(x + d, y + d), (int)inf));
        if (itr1 - xy[i].begin() <= prei) {
          itr1 = xy[i].begin() + prei;
        }
        for (auto itr = itr1; itr != itr2; itr++) {
          uf.unite(idx, itr->second);
        }
        prex = x;
        prei = itr2 - xy[i].begin() - 1;
     
      } 
    }
  }

    
  ll ans = 0;
  rep (i, 2) {
    rep (j, n) {
      ll x = xy[i][j].first.first, y = xy[i][j].first.second;
      int idx = xy[i][j].second;
      if (!uf.same(a, idx)) {
        continue;
      }
      auto itr1 = lower_bound(all(xy[i]), mp(pll(x + d, y - d), (int)-1));
      auto itr2 = lower_bound(all(xy[i]), mp(pll(x + d, y + d), (int)inf));

      ans += itr2 - itr1;
    }
  }
  ll cnt = 0;
  rep (i, n) {
    ll x = xy[0][i].first.first, y = xy[0][i].first.second;
    int idx = xy[0][i].second;
    if (!uf.same(a, idx)) {
      continue;
    }
    for (int i1 = -1; i1 <= 1; i1 += 2) {
      for (int j1 = -1; j1 <= 1; j1 += 2) {
        ll nx = x + i1*d, ny = y + j1 * d;
        if (st.count(pll(nx, ny))) {
          cnt++;
        }
      }
    }
  }
  ans = ans - cnt/2;
  cout << ans << endl;
  
}
      


Measured memory_bytes: 12380