#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
typedef double db;

#define fr first
#define sc second
#define pb push_back
#define rep(i,x) for(ll i=0;i<x;i++)
#define rep1(i,x) for(ll i=1;i<=x;i++)
#define rrep(i,x) for(ll i=x-1;i>=0;i--)
#define rrep1(i,x) for(ll i=x;i>0;i--)
P p[100000];
ll N;
ll x,y;
P py[100000];
P px[100000];
bool musta1[100000];
bool mustb1[100000];
bool musta2[100000];
bool mustb2[100000];

bool ok(ll W){
	memset(musta1,0,sizeof(musta1));
	memset(musta2,0,sizeof(musta2));
	memset(mustb1,0,sizeof(mustb1));
	memset(mustb2,0,sizeof(mustb2));
	// about Y
	rep(i,N){
		if(py[i].fr-py[0].fr>W){
			if(py[N-1].fr-py[i].fr>W) return 0;
			mustb1[py[i].sc]=1;
		}
		else if(py[N-1].fr-py[i].fr>W) musta1[py[i].sc]=1;
	}
	// about X
	rep(i,N){
		if(px[i].fr-px[0].fr>W){
			if(px[N-1].fr-px[i].fr>W) return 0;
			mustb2[px[i].sc]=1;
		}
		else if(px[N-1].fr-px[i].fr>W) musta2[px[i].sc]=1;
	}
	rep(i,N){//a1=a2 b1=b2
		if((musta1[i]&&mustb2[i])||(mustb1[i]&&musta2[i])) break;
		if(i==N-1) return 1;
	}
	rep(i,N){
		if((musta1[i]&&musta2[i])||(mustb1[i]&&mustb2[i])) break;
		if(i==N-1) return 1;
	}
	return 0;
}
int main()
{
	cin>>N;
	rep(i,N){
		cin>>x>>y;
		p[i].fr=-x+y;
		p[i].sc=x+y;
		py[i].fr=p[i].fr;
		px[i].fr=p[i].sc;
		py[i].sc=px[i].sc=i;
	}
	sort(py,py+N);
	sort(px,px+N);
	ll lb=0;
	ll ub=1e+6;
	while(ub-lb>1){
		ll mid=(ub+lb)/2;
		if(ok(mid)) ub=mid;
		else lb=mid;
	}
	cout<<ub<<endl;
}