#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define F first
#define S second
#define ALL(a) (a).begin(),(a).end()
#define MAXX 1005
#define int long long int
#define INT_BITS 32
const int MOD = 1000000007;
void unique_combination(int l, int sum, int K,
                        vector<int>& local, vector<int>& A)
{
    // If a unique combination is found
    if (sum == K) {
        cout << "{";
        for (int i = 0; i < local.size(); i++) {
            if (i != 0)
                cout << " ";
            cout << local[i];
            if (i != local.size() - 1)
                cout << ", ";
        }
        cout << "}" << endl;
        return;
    }
  
    // For all other combinations
    for (int i = l; i < A.size(); i++) {
  
        // Check if the sum exceeds K
        if (sum + A[i] > K)
            continue;
  
        // Check if it is repeated or not
        if (i and A[i] == A[i - 1] and i > l)
            continue;
  
        // Take the element into the combination
        local.push_back(A[i]);
  
        // Recursive call
        unique_combination(i + 1, sum + A[i],
                           K, local, A);
  
        // Remove element from the combination
        local.pop_back();
    }
}
  
// Function to find all combination
// of the given elements
void Combination(vector<int> A, int K)
{
    // Sort the given elements
    sort(A.begin(), A.end());
  
    // To store combination
    vector<int> local;
  
    unique_combination(0, 0, K, local, A);
}
int power(int a,int n)
{

    int res = 1;
    while(n)
    {
        if(n&1)
        {
            n--;
            res = ((res%MOD)*(a%MOD))%MOD;
        }
        else
        {
            n/=2;
            a = ((a%MOD)*(a%MOD))%MOD;
        }
    }
    return (res%MOD);
}


int gcd(int a,int b)
{
    if(b == 0)
        return a;
    return gcd(b,a%b);
}
int ncr(int n, int r, int p=MOD)
{
    // Optimization for the cases when r is large
    if (r > n - r)
        r = n - r;
  
    // The array C is going to store last row of
    // pascal triangle at the end. And last entry
    // of last row is nCr
    int C[r + 1];
    memset(C, 0, sizeof(C));
  
    C[0] = 1; // Top row of Pascal Triangle
  
    // One by constructs remaining rows of Pascal
    // Triangle from top to bottom
    for (int i = 1; i <= n; i++) {
  
        // Fill entries of current row using previous
        // row values
        for (int j = min(i, r); j > 0; j--)
  
            // nCj = (n-1)Cj + (n-1)C(j-1);
            C[j] = (C[j] + C[j - 1]) % p;
    }
    return C[r];
}

void solve()
{
    int n;
    cin>>n;
    int x,y;
    vector<int> v1,v2;
    for(int i=0;i<n;i++)
    {
        cin>>x>>y;
        v1.pb(x+y);
        v2.pb(x-y);
    }
    sort(ALL(v1));
    sort(ALL(v2));
    int temp1=abs(v1[0]-v1[n-1]);
    int temp2=abs(v2[0]-v2[n-1]);
    cout<<max(temp1,temp2);
    
    
}
int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int T = 1;
    //cin >> T;
    for(int i = 1 ; i <= T ; i++)
    {
        solve();
    }

    return 0;
}
                                                                                                 


Measured memory_bytes: 6680