#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
#define rep(i,n) for(int i=0; i<(int)n; i++)
#define llrep(i,n) for(ll i=0; i<(ll)n; i++)
#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end()) //sortしてから使う
#define INF 2147483647
#define LLINF 9223372036854775807LL
#define kiriage(x,y) (((x)+(y)-1)/(y))
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vp;

int main(){
	int n; cin>>n;
	vector<pair<int, int>> x(n), y(n);
	rep(i,n){
		cin>>x[i].first>>y[i].first;
		x[i].second = i;
		y[i].second = i;
	}
	//fiが座標、seは何個目の組か
	sort(x.rbegin(), x.rend());
	sort(y.rbegin(), y.rend());
	//座標で降順ソート
	vector<tuple<ll, int, int>> t;
	vi one = {0,0,1};
	vi two = {n-1,n-2,n-1};
	llrep(i,3){
		ll nowx = abs(x[one[i]].first-x[two[i]].first);
		ll nowy = abs(y[one[i]].first-y[two[i]].first);
		t.emplace_back(nowx, x[one[i]].second, x[two[i]].second);
		t.emplace_back(nowy, y[one[i]].second, y[two[i]].second);
	}
	sort(rbegin(t), rend(t));
	int cnt = 0;
	int pre_x, pre_y;
	for (auto tmp:t){
		cnt++;
		if (cnt >= 2){
			if (get<1>(tmp) == pre_x && get<2>(tmp) == pre_y){
				continue;
			}
			else cout << get<0>(tmp) << endl;
			return 0;
		}
		pre_x = get<1>(tmp);
		pre_y = get<2>(tmp);
	}
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;

const int maxn=100000+10;

int main()
{
    vector <P> vec,vecx,vecy;
    int n; cin>>n;
    for(int i=0;i<n;i++)
    {
        P a; cin>>a.first>>a.second;
        vec.push_back(a);
    }
    vecx=vec;
    vecy=vec;
    sort(vecx.begin(),vecx.end(),[](P a,P b){return a.first>b.first;});
    sort(vecy.begin(),vecy.end(),[](P a,P b){return a.second>b.second;});
    vector <ll> ans;
    /*ans.push_back(abs(vecx[0].first-vecx[n-1].first));
    ans.push_back(abs(vecx[0].first-vecx[n-2].first));
    ans.push_back(abs(vecx[1].first-vecx[n-1].first));
    ans.push_back(abs(vecy[0].second-vecy[n-1].second));
    ans.push_back(abs(vecy[0].second-vecy[n-2].second));
    ans.push_back(abs(vecy[1].second-vecy[n-1].second));
    sort(ans.begin(),ans.end(),[](ll a,ll b){return a>b;});
    cout<<ans[1]<<endl;*/
    for(int i=n-1;i>0;i--)
    {
        if(abs(vecx[0].first-vecx[i].first)>abs(vecx[0].second-vecx[i].second)) 
            ans.push_back(abs(vecx[0].first-vecx[i].first));
    }
    for(int i=1;i<n-1;i++)
    {
        if(abs(vecx[n-1].first-vecx[i].first)>abs(vecx[n-1].second-vecx[i].second)) 
            ans.push_back(abs(vecx[n-1].first-vecx[i].first));
    }
    for(int i=n-1;i>0;i--)
    {
        if(abs(vecy[0].second-vecy[i].second)>=abs(vecy[0].first-vecy[i].first))
            ans.push_back(abs(vecy[0].second-vecy[i].second));
    }
    for(int i=1;i<n-1;i++)
    {
        if(abs(vecy[n-1].second-vecy[i].second)>=abs(vecy[n-1].first-vecy[i].first))
            ans.push_back(abs(vecy[n-1].second-vecy[i].second));
    }
    sort(ans.begin(),ans.end(),[](ll a,ll b) {return a>b;});
    cout<<ans[1]<<endl;
    return 0;
}