#include <bits/stdc++.h>

using namespace std;

// using mint = long double;
// using mint = modint998244353;
// using mint = modint1000000007;

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<ll, P> T;
typedef pair<ll, vector<ll>> Pd;

const ll INF = 1e18;
const ll fact_table = 320000;

priority_queue<ll> pql;
priority_queue<P> pqp;
// big priority queue
priority_queue<ll, vector<ll>, greater<ll>> pqls;
priority_queue<P, vector<P>, greater<P>> pqps;

// small priority queue
// top pop

ll dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
ll dy[8] = {0, 1, 0, -1, -1, 1, 1, -1};
//↓,→,↑,←

#define p(x) cout << x << "\n";
#define el cout << "\n";
#define pe(x) cout << x << " ";
#define ps(x) cout << fixed << setprecision(25) << x << endl;
#define pu(x) cout << (x);
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define pc(x) cout << x << ",";
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define rep2(i, a, b) for (ll i = a; i <= (b); i++)
#define rep3(i, a, b) for (ll i = a; i >= (b); i--)
#define all(c) begin(c), end(c)
#define sorti(v) sort(all(v))
#define sortd(v)                                                               \
    sort(all(v));                                                              \
    reverse(all(v));
#define SUM(v) accumulate(all(v), 0LL)
#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))

typedef vector<ll> vec;
typedef vector<vector<ll>> mat;

// vec v(n) -> 長さnのベクトルを宣言
// mat dp(h, vec(w)) -> h * w の行列を宣言

// const ll mod = 1000000007ll;
const ll mod = 998244353ll;

ll mypow(ll a, ll b, ll m = mod) {
    ll x = 1;
    while (b) {
        while (!(b & 1)) {
            (a *= a) %= m;
            b >>= 1;
        }
        (x *= a) %= m;
        b--;
    }
    return x;
}
vec rv(ll read) {
    vec res(read);
    for (int i = 0; i < read; i++) {
        cin >> res[i];
    }
    return res;
}
/*
ll fact[fact_table + 5], rfact[fact_table + 5];

void c3_init() {
    fact[0] = rfact[0] = 1;
    for (ll i = 1; i <= fact_table; i++) {
        fact[i] = (fact[i - 1] * i) % mod;
    }
    rfact[fact_table] = mypow(fact[fact_table], mod - 2, mod);
    for (ll i = fact_table; i >= 1; i--) {
        rfact[i - 1] = rfact[i] * i;
        rfact[i - 1] %= mod;
    }
    return;
}

ll c3(ll n, ll r) {
    return (((fact[n] * rfact[r]) % mod) * rfact[n - r]) % mod;
}
*/

bool icpc = false;
bool multicase = false;

ll n, m;
ll xd[200005], yd[200005];

bool solve() {
    cin >> n;
    vector<P> xmax, xmin, ymax, ymin;

    rep(i, n) {
        ll x, y;
        cin >> x >> y;
        xd[i] = x, yd[i] = y;
        xmax.pb(P(x, i));
        xmin.pb(P(x, i));

        sorti(xmin);
        sortd(xmax);

        ymax.pb(P(y, i));
        ymin.pb(P(y, i));

        sorti(ymin);
        sortd(ymax);

        if (i >= 2) {
            xmin.pop_back();
            xmax.pop_back();
            ymin.pop_back();
            ymax.pop_back();
        }
    }
    set<P> st;
    rep(i, 2) {
        rep(j, 2) {
            st.insert(P(xmax[i].second, xmin[j].second));
            st.insert(P(ymax[i].second, ymin[j].second));
        }
    }
    vec v;
    for (auto pa : st) {
        auto [a, b] = pa;
        ll dis = max(abs(xd[a] - xd[b]), abs(yd[a] - yd[b]));
        v.pb(dis);
    }
    sortd(v);
    ll ans = v[1];
    p(ans);

    return true;
}

/*







*/

int main() {
    // ios::sync_with_stdio(false);
    // cin.tie(nullptr);
    if (icpc) {
        while (solve())
            ;
        return 0;
    }
    ll q, testcase = 1;
    if (multicase) {
        cin >> q;
    } else {
        q = 1;
    }
    while (q--) {
        // cout << "Case #" << testcase << ": ";
        solve();
        testcase++;
    }

    // solve();
    return 0;
}
/*
One more time, one more time
“Please just lemme roll for another day”
That’s what she said, What she said
Don’t you know the meanings are hidden under cover?

“One more time? Stop it’s fine.”
“Are’nt you getting tired of doing this?”
“I’ll stop your breath from rolling out… for now.”
*/

/*
... - "How many times will you try?"
.. - "As long as I can bear it"
*/



#include <bits/stdc++.h>
#define fastio()                  \
    ios_base::sync_with_stdio(0); \
    cin.tie(0);                   \
    cout.tie(0)
#define pb push_back
#define show(x) cout << (#x) << " : " << x << endl;
#define ll long long
#define ull unsigned long long
#define ld long double
#define pow power
#define mp make_pair
#define ff first
#define ss second
#define pii pair<ll, ll>
#define sq(x) ((x) * (x))
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define siz(a) int((a).size())
#define For(i,a,b) for(int (i)=(a);(i) < (b); ++(i))
#define Forn(i,a,b) for(int (i)=(a);(i) >= (b); --(i))
#define endl "\n"
#define pi 3.14159265
const ll mod = 1000 * 1000 * 1000 + 7;
const ll mod1 = 998244353;
const ll INF     = 1ll*1000*1000*1000*1000*1000*1000 + 7; 
//typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
//typedef tree<pair<ll, ll>,null_type,less<pair<ll, ll>>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
using namespace std;

ll power(ll x, ll y) 
{ 
   ll res = 1;      
  
   
    while (y > 0) 
    { 
       
        if (y & 1) 
            res = (long long)(res*x); 
  

        y = y>>1; 

        x = (long long)(x*x);

        //cout<<x<<'\n'; 
    } 
    return res; 
} 



// Stolen Templates
template <typename T>
T MIN(T first) { return first; }

template <typename T, typename... Args>
T MIN(T first, Args... args) { return min(first, MIN(args...)); }


template <typename T>
T MAX(T first) { return first; }

template <typename T, typename... Args>

T MAX(T first, Args... args) { return max(first, MAX(args...)); }
// Stolen Templates end here




int main()
{

#ifndef ONLINE_JUDGE    
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif

fastio();

    ll n;
    cin>>n;

    vector <ll> x(n); vector <ll> y(n);
    vector <pii> tx(n); vector <pii> ty(n);

    For(i,0,n) {
        cin>>x[i]>>y[i];
        tx[i].ff = x[i];
        tx[i].ss = i;
        ty[i].ff = y[i];
        ty[i].ss = i;
    }

    ll av1,av2;

    sort(all(tx)); sort(all(ty));


    if (ty.back().ff - ty[0].ff >= tx.back().ff - tx[0].ff) {
        av1 = ty.back().ss;
        av2 = ty[0].ss;
    } else {
        av1 = tx.back().ss;
        av2 = tx[0].ss;
    }

    ll ans = 0;

    For(i,0,n) {
        tx[i].ff = x[i];
        tx[i].ss = i;
        ty[i].ff = y[i];
        ty[i].ss = i;
    }


    vector <pii> cx[3]; vector <pii> cy[3];

    For(i,0,n) {
        if (tx[i].ss != av1) {
            cx[0].pb(tx[i]);
            cy[0].pb(ty[i]);
        }
        if (tx[i].ss != av2) {
            cx[1].pb(tx[i]);
            cy[1].pb(ty[i]);
        }
        if (tx[i].ss != av1 and tx[i].ss != av2) {
            cx[2].pb(tx[i]);
            cy[2].pb(ty[i]);
        }
    }

    For(i,0,3) {
        sort(all(cx[i]));
        sort(all(cy[i]));
        ans = max(ans,cy[i].back().ff - cy[i][0].ff);
        ans = max(ans,cx[i].back().ff - cx[i][0].ff);
    }

    cout<<ans;

return 0;
}

// check all product based operations for integer overflow
// careful of renamed variables especially in loops
//python interactive_runner.py python local_testing_tool.py 0 -- c.exe





  


