#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define mod ((int)1e9+7)
#define lim 1000000000000000007
#define lim1 18446744073709551615  //Unsigned
#define sq(a) ((a)*(a))
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define mms(v,i) memset(v,i,sizeof(v))
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define REP(i,a,b) for (int i = a; i <= b; i++)
#define REPN(i,a,b) for (int i = a; i >= b; i--)
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef pair<int,int> pi;
typedef pair<ll,ll> PL;
typedef pair<ll,int> PLI;
typedef pair<int,ll> PIL;
typedef pair<int,pair<int,int> > pii;
typedef pair<double,double> pdd;
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> indexed_set;
typedef tree<pi,null_type,less<pi>,rb_tree_tag,tree_order_statistics_node_update> indexed_set_pair;
ll power(ll a,ll b) {
   ll res=1;
   while(b){
      if(b%2==1) res=(res*a)%mod;
      a=(a*a)%mod;
      b>>=1;
   }
   return res;
}
ll gcdll(ll a,ll b) {
    if (b==0) return a;
    return gcdll(b,a%b);
}
int gcd(int a,int b) {
    if (b==0) return a;
    return gcd(b,a%b);
}

struct custom_hash {
    static uint64_t splitmix64(uint64_t x) {
        // http://xorshift.di.unimi.it/splitmix64.c
        x += 0x9e3779b97f4a7c15;
        x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
        x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
        return x ^ (x >> 31);
    }

    size_t operator()(uint64_t x) const {
        static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
        return splitmix64(x + FIXED_RANDOM);
    }
};

const int N = (int)2e5+5;
const int M = (int)2e3+5;
const int Q = 102;
const int logN = 19;

const double pie = acos(-1);

int st1[N<<1], st2[N<<1];
void update1(int i, int d) {
  for(;i>0;i>>=1) {
    st1[i] = min(st1[i],d);
  }
}
void update2(int i, int d) {
  for(;i>0;i>>=1) {
    st2[i] = max(st2[i],d);
  }
}
int min_range(int l, int r) {
  int ret = INT_MAX;
  for(;l<r;l>>=1,r>>=1) {
    if(l&1) ret = min(ret, st1[l++]);
    if(r&1) ret = min(ret, st1[--r]);
  }
  return ret;
}
int max_range(int l, int r) {
  int ret = INT_MIN;
  for(;l<r;l>>=1,r>>=1) {
    if(l&1) ret = max(ret, st2[l++]);
    if(r&1) ret = max(ret, st2[--r]);
  }
  return ret;
}
pi a[N];
void solve() {
  int n;
  cin>>n;
  REP(i,1,n) {
    cin>>a[i].first>>a[i].second;
  }
  sort(a+1,a+n+1);
  vector<pii> temp;
  REP(i,1,n) {
    temp.pb({a[i].second, {a[i].first, i}});
  }
  sort(all(temp));
  REP(i,1,(n<<1)-1) {
    st1[i] = INT_MAX;
    st2[i] = INT_MIN;
  }
  ll ans = INT_MIN;
  for(auto it:temp) {
    int x1 = it.second.first, y1 = it.first, i = it.second.second;
    ll min_val = min_range(n,i+n-1);
    ans = max(ans, (ll)(x1+y1)-min_val);
    ll max_val = max_range(i+n,(n<<1));
    ans = max(ans, max_val-(ll)(x1-y1));
    update1(i+n-1, x1+y1);
    update2(i+n-1, x1-y1);
  }
  cout << ans;
}

int main() {
    //freopen("./sort/b2.in","r",stdin);
    //freopen("output.txt","w",stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int T=1;
    //cin>>T;
    REP(TC,1,T) {
        //cout<<"Case #"<<TC<<": ";
        solve();
        //cout<<"\n";
    }
}


Measured memory_bytes: 10296