#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define rep1(i,n) for(int i=1;i<(n);++i)
#include <algorithm>
#include <iostream>
using ll=long long;
using namespace std;

int main() {
int n;
  cin>>n;
  vector<pair<ll,int>>x(n),y(n);
 
  rep(i,n){
  cin>>x[i].first>>y[i].first;
    x[i].second=i+1;
    y[i].second=i+1;
  }
  sort(x.begin(),x.end());
  sort(y.begin(),y.end());
  
  ll ans;
  ll ans1=max((abs(x[1].first-x[n-1].first)),(abs(x[0].first-x[n-2].first)));
    ll ans2=max((abs(y[1].first-y[n-1].first)),(abs(y[0].first-y[n-2].first)));
   ans=max(ans1,ans2);
  if(x[0].second==y[0].second&&x[n-1].second==y[n-1].second){
    cout<<ans<<endl;
  return 0;
  }
  if(abs(x[0].first-x[n-1].first)<ans||abs(y[0].first-y[n-1].first)<ans){
  cout<<ans<<endl;
    return 0;
  }
  cout<<min((abs(x[0].first-x[n-1].first)),(abs(y[0].first-y[n-1].first)))<<endl;
  
}
#include <bits/stdc++.h>
using namespace std;
typedef pair <int,int> P;
typedef long long int ll;

P get_max(vector <P> vec){
	int n=vec.size();
	vector <P> vx(n),vy(n);
	for(int i=0;i<n;i++) vx[i]=P(vec[i].first,i);
	for(int i=0;i<n;i++) vy[i]=P(vec[i].second,i);
	sort(vx.begin(),vx.end());
	sort(vy.begin(),vy.end());
	if(vx[n-1].first-vx[0].first>=vy[n-1].first-vy[0].first){
		return P(vx[0].second,vx[n-1].second);
	}
	return P(vy[0].second,vy[n-1].second);
}
int dist(vector <P> vec,P p){
	int x=p.first,y=p.second;
	return max(abs(vec[x].first-vec[y].first),abs(vec[x].second-vec[y].second));
}
int main(){
	int n;
	scanf("%d",&n);
	vector <P> vec;
	for(int i=0;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		vec.push_back(P(x,y));
	}
	P p=get_max(vec);
	vector <P> v1,v2;
	for(int i=0;i<vec.size();i++){
		if(i!=p.first) v1.push_back(vec[i]);
		if(i!=p.second) v2.push_back(vec[i]);
	}
	P q=get_max(v1),r=get_max(v2);
	printf("%d\n",max(dist(v1,q),dist(v2,r)));
}