# include <stdio.h>
# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define x first
# define y second
# define ll long long
# define IOS ios_base :: sync_with_stdio(0);cin.tie(0)
# define p(v) cerr << #v << " = " << v << '\n'
# define p2(v) cerr << #v << " = " << (complex < int > (v.x,v.y)) << '\n'
# define vi vector < int >
# define vl vector < ll >
# define pii pair < int , int >
# define mp make_pair
# define db long double
# define pb push_back
# define pdd pair < db , db >
# define int ll
int32_t main(void)
{
    #ifdef CF
    freopen("input","r",stdin);
    #endif // CF
    srand(time(0));
    fo << fixed << setprecision(7);
    cerr << fixed << setprecision(7);
    int n,a,b;
    IOS;
    fi>>n>>a>>b;
    static pii s[1 << 20];
    for (int i = 1;i <= n;++i)
        {
            int xx,yy;
            fi>>xx>>yy;
            s[i].x = xx + yy;
            s[i].y = xx - yy;
        }
    vi v;
    for (int i = 1;i <= n;++i)
        v.pb(s[i].x),v.pb(s[i].y);
    sort(v.begin(),v.end());
    v.resize(unique(v.begin(),v.end()) - v.begin());
    int sz = v.size();
    static int was[1 << 20];
    static int D[1 << 20];
    static int p[1 << 20];
    static multiset < pii > gx[1 << 20],gy[1 << 20];
    for (int i = 1;i <= n;++i)
        gx[lower_bound(v.begin(),v.end(),s[i].x) - v.begin() + 1].insert(mp(s[i].y,i)),
        gy[lower_bound(v.begin(),v.end(),s[i].y) - v.begin() + 1].insert(mp(s[i].x,i));
    int dist = max(abs(s[a].x - s[b].x),abs(s[a].y - s[b].y));
    was[a] = was[b] = 1;
    queue < int > Q;
    Q.push(a);
    Q.push(b);
    while (!Q.empty())
    {
        int node = Q.front();
        Q.pop();
        for (int i = -1;i < 2;++i)
        if (i)
        {
            int xx = lower_bound(v.begin(),v.end(),s[node].x + i * dist) - v.begin() + 1;
            if (xx > sz || s[node].x + i * dist != v[xx - 1]) continue;
            do
            {
                auto it = gx[xx].lower_bound(mp(s[node].y - dist,-1));
                if (it != gx[xx].end() && it->x <= s[node].y + dist)
                {
                    if (!was[it->y])
                        was[it->y] = 1,Q.push(it->y);
                    gx[xx].erase(it);
                }
                else break;
            } while (1);
        }
        for (int i = -1;i < 2;++i)
        if (i)
        {
            int yy = lower_bound(v.begin(),v.end(),s[node].y + i * dist) - v.begin() + 1;
            if (yy > sz || s[node].y + i * dist != v[yy - 1]) continue;
            do
            {
                auto it = gy[yy].lower_bound(mp(s[node].x - dist,-1));
                if (it != gy[yy].end() && it->x <= s[node].x + dist)
                {
                    if (!was[it->y])
                        was[it->y] = 1,Q.push(it->y);
                    gy[yy].erase(it);
                }
                else break;
            } while (1);
        }
    }
    static vi g1[1 << 20];
    static vi g2[1 << 20];
    for (int i = 1;i <= n;++i)
        g1[lower_bound(v.begin(),v.end(),s[i].x) - v.begin() + 1].pb(s[i].y),
        g2[lower_bound(v.begin(),v.end(),s[i].y) - v.begin() + 1].pb(s[i].x);
    for (int i = 1;i <= sz;++i)
        sort(g1[i].begin(),g1[i].end()),
        sort(g2[i].begin(),g2[i].end());
    for (int i = 1;i <= n;++i)
    {
        for (int j = -1;j < 2;++j)
            if (j)
            {
                int xx = lower_bound(v.begin(),v.end(),s[i].x + j * dist) - v.begin() + 1;
                if (xx > sz || s[i].x + j * dist != v[xx - 1]) continue;
                D[i] += lower_bound(g1[xx].begin(),g1[xx].end(),s[i].y + dist + 1) - lower_bound(g1[xx].begin(),g1[xx].end(),s[i].y - dist);
            }
        for (int j = -1;j < 2;++j)
            if (j)
            {
                int yy = lower_bound(v.begin(),v.end(),s[i].y + j * dist) - v.begin() + 1;
                if (yy > sz || s[i].y + j * dist != v[yy - 1]) continue;
                D[i] += lower_bound(g2[yy].begin(),g2[yy].end(),s[i].x + dist) - lower_bound(g2[yy].begin(),g2[yy].end(),s[i].x - dist + 1);
            }
    }
    int ans = 0;
    for (int i = 1;i <= n;++i)
        ans += was[i] * D[i];
    ans /= 2;
    fo << ans << '\n';
    cerr << "Time elapsed :" << clock() * 1000.0 / CLOCKS_PER_SEC << " ms" << '\n';
    return 0;
}


Measured memory_bytes: 168048