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 Rust (1.42.0) (judge verdict: Time Limit Exceeded)

use std::collections::VecDeque;
use std::fmt::Debug;
use std::str::FromStr;

pub struct TokenReader {
    reader: std::io::Stdin,
    tokens: Vec<String>,
    index: usize,
}

impl TokenReader {
    pub fn new() -> Self {
        Self {
            reader: std::io::stdin(),
            tokens: Vec::new(),
            index: 0,
        }
    }

    pub fn next<T>(&mut self) -> T
    where
        T: FromStr,
        T::Err: Debug,
    {
        if self.index >= self.tokens.len() {
            self.load_next_line();
        }
        self.index += 1;
        self.tokens[self.index - 1].parse().unwrap()
    }

    pub fn vector<T>(&mut self) -> Vec<T>
    where
        T: FromStr,
        T::Err: Debug,
    {
        if self.index >= self.tokens.len() {
            self.load_next_line();
        }
        self.index = self.tokens.len();
        self.tokens.iter().map(|tok| tok.parse().unwrap()).collect()
    }

    pub fn load_next_line(&mut self) {
        let mut line = String::new();
        self.reader.read_line(&mut line).unwrap();

        self.tokens = line.split_whitespace().map(String::from).collect();
        self.index = 0;
    }
}

fn max_dist(points: &VecDeque<(i64, i64)>, (x, y): (i64, i64)) -> i64 {
    points
        .iter()
        .map(|&(a, b)| (a - x).abs() + (b - y).abs())
        .max()
        .unwrap_or(0)
}

fn solve(mut points: Vec<(i64, i64)>) -> i64 {
    points.sort();

    let mut tops = VecDeque::new();
    let mut bots = VecDeque::new();

    let mut res = 0;
    for (x, y) in points {
        res = std::cmp::max(res, max_dist(&tops, (x, y)));
        res = std::cmp::max(res, max_dist(&bots, (x, y)));

        if tops.is_empty() || tops.back().unwrap().0 <= y {
            tops.push_back((x, y));
        }
        if bots.is_empty() || bots.back().unwrap().0 >= y {
            bots.push_back((x, y));
        }

        while tops.len() > 1 {
            let a = tops.get(0).unwrap();
            let b = tops.get(1).unwrap();
            if (b.0 - a.0) <= (b.1 - a.1) {
                tops.pop_front();
            } else {
                break;
            }
        }
    }
    res
}

fn main() {
    let mut reader = TokenReader::new();
    let n = reader.next();
    let points = (0..n).map(|_| (reader.next(), reader.next())).collect();

    let res = solve(points);
    println!("{}", res);
}