//二分判定 覆盖问题 BZOJ 1052
// 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合。
// 然后枚举每个角,再解决子问题
#include <bits/stdc++.h>
using namespace std;
#define LL long long
typedef pair<int,int> pii;
const int inf = 1e9;
const int MOD =;
const int N =;
#define clc(a,b) memset(a,b,sizeof(a))
const double eps = 1e-;
void fre() {freopen("in.txt","r",stdin);}
void freout() {freopen("out.txt","w",stdout);}
inline int read() {int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-; ch=getchar();}while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}return x*f;}
struct node{
int x[],y[];
int num;
}a,b;
int n,mid;
void solve2(node &a,int x1,int y1,int x2,int y2){
int cnt=;
for(int i=;i<a.num;i++){
if(a.x[i]<x1||a.x[i]>x2||a.y[i]>y2||a.y[i]<y1){
a.x[cnt]=a.x[i];
a.y[cnt]=a.y[i];
cnt++;
}
}
a.num=cnt;
}
void solve(node &a,int f){
int x1=inf,x2=-inf,y1=inf,y2=-inf;
for(int i=;i<a.num;i++){
x1=min(x1,a.x[i]);
x2=max(x2,a.x[i]);
y1=min(y1,a.y[i]);
y2=max(y2,a.y[i]);
}
if(f==) solve2(a,x1,y1,x1+mid,y1+mid);
if(f==) solve2(a,x2-mid,y1,x2,y1+mid);
if(f==) solve2(a,x1,y2-mid,x1+mid,y2);
if(f==) solve2(a,x2-mid,y2-mid,x2,y2);
}
bool check(){
for(int s=;s<=;s++){
for(int t=;t<=;t++){
b.num=a.num;
for(int i=;i<b.num;i++){
b.x[i]=a.x[i],b.y[i]=a.y[i];
}
solve(b,s),solve(b,t);
int x1=inf,x2=-inf,y1=inf,y2=-inf;
for(int i=;i<b.num;i++){
x1=min(x1,b.x[i]);
x2=max(x2,b.x[i]);
y1=min(y1,b.y[i]);
y2=max(y2,b.y[i]);
}
if(x2-x1<=mid&&y2-y1<=mid) return true;
}
}
return false;
}
int main(){
n=read();
for(int i=;i<n;i++) a.x[i]=read(),a.y[i]=read();
a.num=n;
int l=,r=inf;
while(l<=r){
mid=(l+r)>>;
if(check()) r=mid-;
else l=mid+;
}
printf("%d\n",l);
return ;
}