#include"bits/stdc++.h"
using namespace std;
using ll = int64_t;

#define ALL(c) (c).begin(),(c).end()

ll N, T, ret;
vector<ll> x, y;
map<ll, vector<pair<ll, ll>>> u_vec, v_vec;
map<ll, set<pair<ll, ll>>> u_set, v_set;

void dfs(ll cur) {
    //(x, y)を45度回転した座標を(u, v)とする
    ll u = y[cur] - x[cur];
    ll v = y[cur] + x[cur];

    //(u, v)を中心とする一辺の長さがTの正方形の周上にある点の個数を数える
    ret += lower_bound(ALL(u_vec[u + T]), make_pair(x[cur], (ll)0)) - lower_bound(ALL(u_vec[u + T]), make_pair(x[cur] - T, (ll)0));
    ret += lower_bound(ALL(v_vec[v + T]), make_pair(x[cur] + T + 1, (ll)0)) - lower_bound(ALL(v_vec[v + T]), make_pair(x[cur], (ll)0));
    ret += lower_bound(ALL(u_vec[u - T]), make_pair(x[cur] + T, (ll)0)) - lower_bound(ALL(u_vec[u - T]), make_pair(x[cur], (ll)0));
    ret += lower_bound(ALL(v_vec[v - T]), make_pair(x[cur], (ll)0)) - lower_bound(ALL(v_vec[v - T]), make_pair(x[cur] - T + 1, (ll)0));

    //(u, v)は調査し終えたのでsetから外す
    u_set[u].erase({ x[cur],cur });
    v_set[v].erase({ x[cur],cur });

    //正方形の周上にあってまだ未調査のものがあったらそこへ遷移する
    //右
    while (true) {
        auto it = u_set[u + T].lower_bound({ x[cur] - T, 0 });
        if (it == u_set[u + T].end() || it->first > x[cur]) break;
        dfs(it->second);
    }

    //左
    while (true) {
        auto it = u_set[u - T].lower_bound({ x[cur], 0 });
        if (it == u_set[u - T].end() || it->first > x[cur] + T) break;
        dfs(it->second);
    }

    //上
    while (true) {
        auto it = v_set[v + T].lower_bound({ x[cur], 0 });
        if (it == v_set[v + T].end() || it->first > x[cur] + T) break;
        dfs(it->second);
    }

    //下
    while (true) {
        auto it = v_set[v - T].lower_bound({ x[cur] - T, 0 });
        if (it == v_set[v - T].end() || it->first > x[cur]) break;
        dfs(it->second);
    }
}

int main() {
    ll A, B;
    cin >> N >> A >> B;
    A--, B--;
    x.resize(N);
    y.resize(N);
    for (ll i = 0; i < N; i++) {
        cin >> x[i] >> y[i];
        u_vec[y[i] - x[i]].push_back({ x[i],i });
        v_vec[x[i] + y[i]].push_back({ x[i],i });
        u_set[y[i] - x[i]].insert({ x[i],i });
        v_set[x[i] + y[i]].insert({ x[i],i });
    }

    T = abs(x[A] - x[B]) + abs(y[A] - y[B]);

    for (auto& r : u_vec) sort(ALL(r.second));
    for (auto& r : v_vec) sort(ALL(r.second));

    dfs(A);
    cout << ret / 2 << endl;
}

//#include"bits/stdc++.h"
//using namespace std;
//
////#define int long long
//#define reps(i,s,n) for(int (i)=(s);(i)<(ll)(n);++(i))
//#define rep(i,n) reps(i,0,n)
//#define rept(i,n) reps(i,0,((n)+1))
//#define repst(i,s,n) reps(i,s,((n)+1))
//#define reprt(i,n,t) for(ll (i)=(n);(i)>=(t);--(i))
//#define repr(i,n) reprt(i,n,0)
//#define each(itr,v) for(auto &(itr):(v))
//#define all(c) (c).begin(),(c).end()
//#define pb push_back
//#define mp(x,y) make_pair((x),(y))
//#define fi first
//#define se second
//#define tmax(x,y,z) max(x,max(y,z))
//#define tmin(x,y,z) min(x,min(y,z))
//#define chmin(x,y) x=min(x,y)
//#define chmax(x,y) x=max(x,y)
//#define ln '\n'
//#define dbg(x) cout<<#x" = "<<(x)<<ln
//#define dbga(x,n) {cout<<#x" : ";for(int (i)=0;i<(n);++i){cout<<((x)[i])<<(i==((n)-1)?'\n':' ');}}
//
//typedef long double ld;
//typedef long long ll;
//typedef pair<int, int> pii;
//typedef pair<ll, ll> pll;
//typedef vector<int> vi;
//typedef vector<ll> vl;
//typedef vector<bool> vb;
//typedef vector<ld> vld;
//typedef vector<pii> vpii;
//typedef vector<pll> vpll;
//typedef vector<vector<int> > mat;
//
//const ll inf = (ll)1e9 + 10;
//const ll linf = (ll)1e18 + 10;
//const ll mod = (ll)(1e9 + 7);
//const int dx[] = { 0, 1, 0, -1 };
//const int dy[] = { 1, 0, -1, 0 };
//const int ddx[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
//const int ddy[] = { 1, 1, 0, -1, -1, -1, 0, 1 };
//const double eps = 1e-10;
//
//struct oreno_initializer {
//    oreno_initializer() {
//        cin.tie(0);
//        ios::sync_with_stdio(0);
//    }
//} oreno_initializer;
//
//// ━━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…
//// .｡.:( ^ω^)・ﾟ＋.｡.:( ^ω^)・ﾟ＋.｡.:( ^ω^)・ﾟ＋.｡.:( ^ω^)・ﾟ＋.｡.:( ^ω^)・ﾟ＋
//// ・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・‥…━━━☆・
//
//// a,b間のマンハッタン距離をkとおくと
//// "頂点aからスタートしてマンハッタン距離kの点に辺を引いて進めるとき、最大何本辺を引けるか" って問題に言い換えられる
//// 45度回転してあるから、頂点vからマンハッタン距離がkの点ってのはvを中心とした1辺の長さ2kの正方形の周上の点全て
//
//int n, a, b;
//ll x[114514], y[114514], k, res;
//map<ll, vector<pair<ll, int>>> u, d;
//map<ll, set<pair<ll, int>>> us, ds;
//
//void rec(int c) {
//    //cout << c << "にいます！" << ln;
//    // 45度回転後のx,y
//    ll ud = y[c] - x[c], dd = y[c] + x[c];
//    // 頂点cを使用済みにする(setから削除)
//    us[ud].erase({ x[c],c });
//    ds[dd].erase({ x[c],c });
//    // 頂点cから距離kの点の数をカウント 正方形の4辺に対応
//    res += lower_bound(all(u[ud + k]), mp(x[c], 0)) - lower_bound(all(u[ud + k]), mp(x[c] - k, 0));
//    res += lower_bound(all(d[dd + k]), mp(x[c] + k + 1, 0)) - lower_bound(all(d[dd + k]), mp(x[c], 0));
//    res += lower_bound(all(u[ud - k]), mp(x[c] + k, 0)) - lower_bound(all(u[ud - k]), mp(x[c], 0));
//    res += lower_bound(all(d[dd - k]), mp(x[c], 0)) - lower_bound(all(d[dd - k]), mp(x[c] - k + 1, 0));
//    //cout << res << ln;
//    // ⇡のうちまだ探索していない点に移動して同様のことをする
//    while (true) {
//        auto it = us[ud + k].lower_bound({ x[c] - k,0 });
//        if (it == us[ud + k].end() || it->fi > x[c]) break;
//        rec(it->se);
//    }
//    while (true) {
//        auto it = us[ud - k].lower_bound({ x[c],0 });
//        if (it == us[ud - k].end() || it->fi > x[c] + k) break;
//        rec(it->se);
//    }
//    while (true) {
//        auto it = ds[dd + k].lower_bound({ x[c],0 });
//        if (it == ds[dd + k].end() || it->fi > x[c] + k) break;
//        rec(it->se);
//    }
//    while (true) {
//        auto it = ds[dd - k].lower_bound({ x[c] - k,0 });
//        if (it == ds[dd - k].end() || it->fi > x[c]) break;
//        rec(it->se);
//    }
//}
//
//signed main() {
//    cin >> n >> a >> b;
//    a--, b--;
//    rep(i, n) {
//        cin >> x[i] >> y[i];
//        // 45度回転 (倍率==2点間の距離は変わる)
//        u[y[i] - x[i]].pb({ x[i],i });
//        d[y[i] + x[i]].pb({ x[i],i });
//        us[y[i] - x[i]].insert({ x[i],i });
//        ds[y[i] + x[i]].insert({ x[i],i });
//    }
//    k = abs(x[a] - x[b]) + abs(y[a] - y[b]);
//    each(i, u) sort(all(i.se));
//    each(i, d) sort(all(i.se));
//    rec(a);
//    // recでは各頂点について自身とk離れた点の数を数え上げているので2重にカウントしている
//    cout << res / 2 << ln;
//}

Measured memory_bytes: 95360