#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#define F first
#define S second
using namespace std;
int n;
int f[111111];
int x[111111];
int y[111111];
priority_queue< pair<int,int> > que[3][4];
int main(void){
  cin >> n;
  for(int i = 0; i < n; i++){
    cin >> x[i] >> y[i];
    que[0][0].push( make_pair( x[i]+y[i],i) );
    que[0][1].push( make_pair(-x[i]-y[i],i) );
    que[0][2].push( make_pair( x[i]-y[i],i) );
    que[0][3].push( make_pair(-x[i]+y[i],i) );
  }

  while(!que[0][0].empty()){
    int best = 0,g,a,b;
    for(int i = 0; i < 3; i++){
      if(que[i][0].empty()) continue;
      for(int j = 0; j < 4; j++){
	int t = que[0][j].top().F + que[i][j+((j%2)?-1:1)].top().F;
	if(best < t){
	  best = t;
	  g = i;
	  a = que[0][j].top().S;
	  b = que[i][j+((j%2)?-1:1)].top().S;
	}
      }
    }
    if(g==1){
      f[a] = 2;
      que[2][0].push( make_pair( x[a]+y[a],a) );
      que[2][1].push( make_pair(-x[a]-y[a],a) );
      que[2][2].push( make_pair( x[a]-y[a],a) );
      que[2][3].push( make_pair(-x[a]+y[a],a) );
    }else if(g==2){
      f[a] = 1;
      que[1][0].push( make_pair( x[a]+y[a],a) );
      que[1][1].push( make_pair(-x[a]-y[a],a) );
      que[1][2].push( make_pair( x[a]-y[a],a) );
      que[1][3].push( make_pair(-x[a]+y[a],a) );
    }else{
      int c=0,d=0;
      if(!que[1][0].empty()){
	c = max(c,que[1][0].top().F + (-x[a]-y[a]) );
	//c = max(c,que[1][1].top().F + ( x[a]+y[a]) );
	c = max(c,que[1][2].top().F + (-x[a]+y[a]) );
	//c = max(c,que[1][3].top().F + ( x[a]-y[a]) );

	d = max(d,que[1][0].top().F + (-x[b]-y[b]) );
	//d = max(d,que[1][1].top().F + ( x[b]+y[b]) );
	d = max(d,que[1][2].top().F + (-x[b]+y[b]) );
	//d = max(d,que[1][3].top().F + ( x[b]-y[b]) );
      }
      if(!que[2][0].empty()){
	c = max(c,que[2][0].top().F + (-x[b]-y[b]) );
	//c = max(c,que[2][1].top().F + ( x[b]+y[b]) );
	c = max(c,que[2][2].top().F + (-x[b]+y[b]) );
	//c = max(c,que[2][3].top().F + ( x[b]-y[b]) );

	d = max(d,que[2][0].top().F + (-x[a]-y[a]) );
	//d = max(d,que[2][1].top().F + ( x[a]+y[a]) );
	d = max(d,que[2][2].top().F + (-x[a]+y[a]) );
	//d = max(d,que[2][3].top().F + ( x[a]-y[a]) );
      }
      if(c < d){
	f[a] = 1;
	que[1][0].push( make_pair( x[a]+y[a],a) );
	que[1][1].push( make_pair(-x[a]-y[a],a) );
	que[1][2].push( make_pair( x[a]-y[a],a) );
	que[1][3].push( make_pair(-x[a]+y[a],a) );
	f[b] = 2;
	que[2][0].push( make_pair( x[b]+y[b],b) );
	que[2][1].push( make_pair(-x[b]-y[b],b) );
	que[2][2].push( make_pair( x[b]-y[b],b) );
	que[2][3].push( make_pair(-x[b]+y[b],b) );
      }else{
	f[a] = 2;
	que[2][0].push( make_pair( x[a]+y[a],a) );
	que[2][1].push( make_pair(-x[a]-y[a],a) );
	que[2][2].push( make_pair( x[a]-y[a],a) );
	que[2][3].push( make_pair(-x[a]+y[a],a) );
	f[b] = 1;
	que[1][0].push( make_pair( x[b]+y[b],b) );
	que[1][1].push( make_pair(-x[b]-y[b],b) );
	que[1][2].push( make_pair( x[b]-y[b],b) );
	que[1][3].push( make_pair(-x[b]+y[b],b) );
      }
    }
    for(int i = 0; i < 4; i++){
      while(!que[0][i].empty() && f[que[0][i].top().S]){
	que[0][i].pop();
      }
    }
  }

  int best = 0;
  for(int i = 1; i < 3; i++){
    for(int j = 0; j < 4; j++){
      best = max(best,que[i][j].top().F + que[i][j+((j%2)?-1:1)].top().F);
    }
  }

  cout << best << endl;
}

Measured memory_bytes: 9792