#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;
}