#include<bits/stdc++.h>
#define FILE "read"
#define INF 1e9
#define MAXN 500010
#define cmin(a,b) a=min(a,b)
#define cmax(a,b) a=max(a,b)
using namespace std;
struct node{int d[2],son[2],mx[2],mn[2];}tr[MAXN];
int n,Key,root,ans,maxx,minn,D[2],a[MAXN][2];
inline int read(){
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
bool cmp(node a,node b){return a.d[Key]<b.d[Key];}
void updata(int p){
for(int i=0;i<=1;++i){
if(tr[p].son[0]){
cmax(tr[p].mx[i],tr[tr[p].son[0]].mx[i]);
cmin(tr[p].mn[i],tr[tr[p].son[0]].mn[i]);
}
if(tr[p].son[1]){
cmax(tr[p].mx[i],tr[tr[p].son[1]].mx[i]);
cmin(tr[p].mn[i],tr[tr[p].son[1]].mn[i]);
}
}
}
void build(int &p,int l,int r,int k){
int mid=(l+r)>>1; p=mid; Key=k;
nth_element(tr+l,tr+mid,tr+r+1,cmp);
for(int i=0;i<=1;++i) tr[p].mx[i]=tr[p].mn[i]=tr[p].d[i];
if(l<=mid-1) build(tr[p].son[0],l,mid-1,k^1);
if(mid+1<=r) build(tr[p].son[1],mid+1,r,k^1);
updata(p);
}
int getmax(int p){
int ret=0;
for(int i=0;i<=1;++i) ret+=max(abs(tr[p].mx[i]-D[i]),abs(tr[p].mn[i]-D[i]));
return ret;
}
int getmin(int p){
int ret=0;
for(int i=0;i<=1;++i) ret+=max(D[i]-tr[p].mx[i],0)+max(tr[p].mn[i]-D[i],0);
return ret;
}
void query_max(int p){
cmax(maxx,abs(tr[p].d[0]-D[0])+abs(tr[p].d[1]-D[1]));
int dl=-INF,dr=-INF;
if(tr[p].son[0]) dl=getmax(tr[p].son[0]);
if(tr[p].son[1]) dr=getmax(tr[p].son[1]);
if(dl>dr){
if(dl>maxx) query_max(tr[p].son[0]);
if(dr>maxx) query_max(tr[p].son[1]);
}
else{
if(dr>maxx) query_max(tr[p].son[1]);
if(dl>maxx) query_max(tr[p].son[0]);
}
}
void query_min(int p){
if(abs(tr[p].d[0]-D[0])+abs(tr[p].d[1]-D[1])) cmin(minn,abs(tr[p].d[0]-D[0])+abs(tr[p].d[1]-D[1]));
int dl=INF,dr=INF;
if(tr[p].son[0]) dl=getmin(tr[p].son[0]);
if(tr[p].son[1]) dr=getmin(tr[p].son[1]);
if(dl<dr){
if(dl<minn) query_min(tr[p].son[0]);
if(dr<minn) query_min(tr[p].son[1]);
}
else{
if(dr<minn) query_min(tr[p].son[1]);
if(dl<minn) query_min(tr[p].son[0]);
}
}
int main(){
int n=read(); ans=INF;
for(int i=1;i<=n;++i){
a[i][0]=read(); a[i][1]=read();
tr[i].d[0]=a[i][0]; tr[i].d[1]=a[i][1];
}
build(root,1,n,0);
for(int i=1;i<=n;++i){
D[0]=a[i][0]; D[1]=a[i][1];
maxx=-INF; minn=INF;
query_max(root);
query_min(root);
cmin(ans,maxx-minn);
}
printf("%d\n",ans);
return 0;
}