
#include <set>
#include <map>
#include <iostream>
using namespace std;

void add(multimap<long long, long long>& D, long long dist, long long i1, long long i2) {
    D.emplace(dist, i1 > i2 ? i2 << 32 | i1 : i1 << 32 | i2);
}

int main(void){
    // Your code here!
    long long N;
    multimap<long long, long long> X;
    multimap<long long, long long> Y;
    multimap<long long, long long> D;

    cin>> N;
    
    for (int i = 0; i < N; i++) {
        long long x, y;
        cin >> x >> y;
        X.emplace(x, i);        
        Y.emplace(y, i);        
    }
    
    auto xb = X.begin();
    auto xr = X.rbegin();
    auto yb = Y.begin();
    auto yr = Y.rbegin();

    add(D, abs(xr->first - xb->first), xr->second, xb->second);
    xr++;
    add(D, abs(xr->first - xb->first), xr->second, xb->second);
    xr = X.rbegin();
    xb++;
    add(D, abs(xr->first - xb->first), xr->second, xb->second);

    add(D, abs(yr->first - yb->first), yr->second, yb->second);
    yr++;
    add(D, abs(yr->first - yb->first), yr->second, yb->second);
    yr = Y.rbegin();
    yb++;
    add(D, abs(yr->first - yb->first), yr->second, yb->second);
    
    
    auto d = D.rbegin();
    long long i = d->second;
//    cout <<  d->first << d->second << endl;
    d++;
//    cout <<  d->first << d->second << endl;
    if (i == d->second) {
        d++;
//    cout <<  d->first << d->second << endl;
    }
    

    cout <<  d->first;
    
}

/**
 * code generated by JHelper
 * More info: https://github.com/AlexeyDmitriev/JHelper
 * @author tatsumack
 */

#include <iostream>
#include <fstream>

#include <bits/stdc++.h>

#define int long long
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define FOR(i, a, b) for (int i = (a), i##_len = (b); i <= i##_len; ++i)
#define REV(i, a, b) for (int i = (a); i >= (b); --i)
#define CLR(a, b) memset((a), (b), sizeof(a))
#define DUMP(x) cout << #x << " = " << (x) << endl;
#define INF 1001001001001001001ll
#define fcout cout << fixed << setprecision(12)

using namespace std;

class A2ndGreatestDistance {
public:
    void solve(std::istream& cin, std::ostream& cout) {
        int N;
        cin >> N;
        vector<int> x(N), y(N);
        vector<pair<int, int>> vx(N), vy(N);
        REP(i, N) {
            cin >> x[i] >> y[i];
            vx[i] = {x[i], i};
            vy[i] = {y[i], i};
        }
        sort(vx.begin(), vx.end());
        sort(vy.begin(), vy.end());
        vector<int> cand;
        cand.push_back(vx[0].second);
        cand.push_back(vx[1].second);
        cand.push_back(vx[N - 1].second);
        cand.push_back(vx[N - 2].second);
        cand.push_back(vy[0].second);
        cand.push_back(vy[1].second);
        cand.push_back(vy[N - 1].second);
        cand.push_back(vy[N - 2].second);
        sort(cand.begin(), cand.end());
        cand.erase(unique(cand.begin(), cand.end()), cand.end());
        vector<int> res;
        REP(ci, cand.size()) {
            int i = cand[ci];
            FOR(cj, ci + 1, cand.size() - 1) {
                int j = cand[cj];
                res.push_back(max(abs(x[i] - x[j]), abs(y[i] - y[j])));
            }
        }
        sort(res.rbegin(), res.rend());
        cout << res[1] << endl;
    }
};


signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    std::istream& in(std::cin);
    std::ostream& out(std::cout);

    A2ndGreatestDistance solver;
    solver.solve(in, out);
    return 0;
}
