Problem:
Score : 500 points

Problem Statement

There are N points on the 2D plane, i-th of which is located on (x_i, y_i).
There can be multiple points that share the same coordinate.
What is the maximum possible Manhattan distance between two distinct points?

Here, the Manhattan distance between two points (x_i, y_i) and (x_j, y_j) is defined by |x_i-x_j| + |y_i-y_j|.

Constraints

2 \leq N \leq 2 \times 10^5

1 \leq x_i,y_i \leq 10^9

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
x_1 y_1
x_2 y_2
:
x_N y_N

Output

Print the answer.

Sample Input 1

3
1 1
2 4
3 2

Sample Output 1

4

The Manhattan distance between the first point and the second point is |1-2|+|1-4|=4, which is maximum possible.

Sample Input 2

2
1 1
1 1

Sample Output 2

0

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 2e5 + 5;
struct node{
	int x,y;
	bool operator < (const node b) const{
		return x != b.x ? x < b.x : y < b.y;
	}
}p[N]; 
vector<int> vx,vy;
int x[N],y[N],c[N][2],n;
inline int lowbit(int x)
{
	return x & (-x);
} 

inline void add(int x,int k,int p)
{
	for(int i = x + 1;i <= n + 1;i += lowbit(i))
		c[i][p] = max(c[i][p],k);
 } 

inline int query(int x,int k)
{
	int ans = -0x7f7f7f7f;
	for(int i = x + 1;i;i -= lowbit(i))
		ans = max(ans,c[i][k]);
	return ans;
}

int main()
{
	register int i;
	scanf("%d",&n);
	for(i = 1;i <= n;++ i)
	{
		scanf("%d%d",&p[i].x,&p[i].y);
		vx.push_back(p[i].x),vy.push_back(p[i].y);		
	}
	sort(vx.begin(),vx.end()),sort(vy.begin(),vy.end());
	vx.erase(unique(vx.begin(),vx.end()),vx.end());
	vy.erase(unique(vy.begin(),vy.end()),vy.end());
	for(i = 1;i <= n;++ i)
	{
		int kx = lower_bound(vx.begin(),vx.end(),p[i].x) - vx.begin() + 1;
		int ky = lower_bound(vy.begin(),vy.end(),p[i].y) - vy.begin() + 1;
		x[kx] = p[i].x,p[i].x = kx,y[ky] = p[i].y,p[i].y = ky;
	}
	sort(p + 1,p + n + 1);
	int ans = 0;
	memset(c,0xcf,sizeof c);
	for(i = 1;i <= n;++ i)
	{
		ans = max(ans,y[p[i].y] + x[p[i].x] + query(p[i].y,0));
		ans = max(ans,x[p[i].x] - y[p[i].y] + query(n - p[i].y,1));
		add(p[i].y,- x[p[i].x] - y[p[i].y],0),add(n - p[i].y,- x[p[i].x] + y[p[i].y],1);
	}
	printf("%d",ans); 
	return 0;
}