#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <algorithm>
#include <set>
#include <map>
#include <bitset>
#include <cmath>
#include <functional>
#include <iomanip>
#define vll vector<ll>
#define vvvl vector<vvl>
#define vvl vector<vector<ll>>
#define VV(a, b, c, d) vector<vector<d>>(a, vector<d>(b, c))
#define VVV(a, b, c, d) vector<vvl>(a, vvl(b, vll (c, d)));
#define re(c, b) for(ll c=0;c<b;c++)
#define all(obj) (obj).begin(), (obj).end()
typedef long long int ll;
typedef long double ld;
using namespace std;

typedef pair<ll, ll> p;

ll INF = 1000000001;

set<vll> ok;
bool add(ll a, ll b){
  if(ok.find(vll{a, b})!=ok.end()) return false;
  ok.insert(vll{a, b});
  return true;
}

int main(int argc, char const *argv[]) {
  ll n, a, b;std::cin >> n >> a >> b;
  a--, b--;
  vll fst, scd;

  //座標系を変換
  vvl d = VV(n, 2, 0, ll);
  for(int i=0;i<n;i++){
    ll x, y;
    scanf("%lld %lld", &x, &y);
    if(i==a) fst = vll{x, y};
    if(i==b) scd = vll{x, y};
    d[i][0] = x + y;
    d[i][1] = x - y;
  }
  ll dist = abs(fst[0] - scd[0]) + abs(fst[1] - scd[1]);
  map<ll, ll> mp;
  for(int i=0;i<n;i++){
    mp.emplace(d[i][0], 0);
    mp.emplace(d[i][1], 0);
  }
  ll cnt = 0;
  for(auto itr = mp.begin();itr!=mp.end();itr++, cnt++){
    (*itr).second = cnt;
  }



  //座圧後のx座標がkの集合(y座標)
  vvl X(mp.size()), Y(mp.size());
  for(int i=0;i<n;i++){
    X[mp.at(d[i][0])].push_back(d[i][1]);
    Y[mp.at(d[i][1])].push_back(d[i][0]);
  }

  for(int i=0;i<mp.size();i++){
    sort(all(X[i]));
    sort(all(Y[i]));
  }

  vector<set<ll>> tmpX(mp.size()), tmpY(mp.size());
  for(int i=0;i<n;i++){
    tmpX[mp.at(d[i][0])].insert(d[i][1]);
    tmpY[mp.at(d[i][1])].insert(d[i][0]);
  }

  //最初の点から訪れることが可能か
  add(d[a][0], d[a][1]);
  add(d[b][0], d[b][1]);

  queue<p> q;
  q.push(p(d[a][0], d[a][1]));
  q.push(p(d[b][0], d[b][1]));

  while(!q.empty()){
    p now = q.front();
    q.pop();
    vector<p> ers;
    //距離がdistのものを探す
    if(mp.find(now.first + dist)!=mp.end()){//x+dist
      ll x = now.first + dist;
      ll mx = mp.at(x);
      auto itr = tmpX[mx].lower_bound(now.second-dist);
      while(itr!=tmpX[mx].end()&&(*itr)<=now.second+dist){
        if(add(x, (*itr))){
          q.push(p(x, (*itr)));
          ers.push_back(p(x, (*itr)));
        }
        itr++;
      }
    }
    if(mp.find(now.first - dist)!=mp.end()){//x-dist
      ll x = now.first - dist;
      ll mx = mp.at(x);

      auto itr = tmpX[mx].lower_bound(now.second-dist);
      while(itr!=tmpX[mx].end()&&(*itr)<=now.second+dist){
        if(add(x, (*itr))){
          q.push(p(x, (*itr)));
          ers.push_back(p(x, (*itr)));
        }
        itr++;
      }
    }
    if(mp.find(now.second + dist)!=mp.end()){//y+dist

      ll y = now.second + dist;
      ll my = mp.at(y);

      auto itr = tmpY[my].lower_bound(now.first-dist);
      while(itr!=tmpY[my].end()&&(*itr)<=now.first+dist){
        if(add((*itr), y)){
          q.push(p((*itr), y));
          ers.push_back(p((*itr), y));
        }
        itr++;
      }
    }
    if(mp.find(now.second - dist)!=mp.end()){//y-dist
      ll y = now.second - dist;
      ll my = mp.at(y);

      auto itr = tmpY[my].lower_bound(now.first-dist);
      while(itr!=tmpY[my].end()&&(*itr)<=now.first+dist){
        if(add((*itr), y)){
          q.push(p((*itr), y));
          ers.push_back(p((*itr), y));
        }
        itr++;
      }
    }
    for(auto t:ers){
      ll tx = mp.at(t.first);
      ll ty = mp.at(t.second);
      tmpX[tx].erase(t.second);
      tmpY[ty].erase(t.first);
    }
  }

  ll ans = 0;

  for(int i=0;i<n;i++){
    if(ok.find(d[i])==ok.end()) continue;

    //四辺-四隅
    ll x = d[i][0], y = d[i][1];
    ll S = 0;

    if(mp.find(x+dist)!=mp.end()){
      ll adx = x+dist;
      ll mx = mp.at(adx);
      ll l = lower_bound(all(X[mx]), y-dist) - X[mx].begin();
      ll r = upper_bound(all(X[mx]), y+dist) - X[mx].begin();
      S += r - l;
    }

    if(mp.find(x-dist)!=mp.end()){
      ll adx = x-dist;
      ll mx = mp.at(adx);
      ll l = lower_bound(all(X[mx]), y-dist) - X[mx].begin();
      ll r = upper_bound(all(X[mx]), y+dist) - X[mx].begin();
      S += r - l;
    }

    if(mp.find(y+dist)!=mp.end()){
      ll ady = y+dist;
      ll my = mp.at(ady);
      ll l = lower_bound(all(Y[my]), x-dist) - Y[my].begin();
      ll r = upper_bound(all(Y[my]), x+dist) - Y[my].begin();
      S += r - l;
    }

    if(mp.find(y-dist)!=mp.end()){
      ll ady = y-dist;
      ll my = mp.at(ady);
      ll l = lower_bound(all(Y[my]), x-dist) - Y[my].begin();
      ll r = upper_bound(all(Y[my]), x+dist) - Y[my].begin();
      S += r - l;
    }

    if(ok.find(vll{x+dist, y+dist})!=ok.end()) S--;
    if(ok.find(vll{x-dist, y+dist})!=ok.end()) S--;
    if(ok.find(vll{x+dist, y-dist})!=ok.end()) S--;
    if(ok.find(vll{x-dist, y-dist})!=ok.end()) S--;

    //コーナーを引く
    ans += S;
  }
  std::cout << ans/2 << '\n';
  return 0;
}


Measured memory_bytes: 50296