The Happy Farm 5 creators decided to invent the mechanism of cow grazing. The cows in the game are very slow and they move very slowly, it can even be considered that they stand still. However, carnivores should always be chased off them. 

For that a young player Vasya decided to make the shepherd run round the cows along one and the same closed path. It is very important that the cows stayed strictly inside the area limited by the path, as otherwise some cows will sooner or later be eaten. To be absolutely sure in the cows' safety, Vasya wants the path completion time to be minimum.

The new game is launched for different devices, including mobile phones. That's why the developers decided to quit using the arithmetics with the floating decimal point and use only the arithmetics of integers. The cows and the shepherd in the game are represented as points on the plane with integer coordinates. The playing time is modeled by the turns. During every turn the shepherd can either stay where he stands or step in one of eight directions: horizontally, vertically, or diagonally. As the coordinates should always remain integer, then the length of a horizontal and vertical step is equal to 1, and the length of a diagonal step is equal to <image>. The cows do not move. You have to minimize the number of moves the shepherd needs to run round the whole herd.

Input

The first line contains an integer N which represents the number of cows in the herd (1 ≤ N ≤ 105). Each of the next N lines contains two integers Xi and Yi which represent the coordinates of one cow of (|Xi|, |Yi| ≤ 106). Several cows can stand on one point.

Output

Print the single number — the minimum number of moves in the sought path.

Examples

Input

4
1 1
5 1
5 3
1 3


Output

16

Note

Picture for the example test: The coordinate grid is painted grey, the coordinates axes are painted black, the cows are painted red and the sought route is painted green.

<image>
import java.io.*;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class C implements Runnable {

    // leave empty to read from stdin/stdout
    private static final String TASK_NAME_FOR_IO = "";

    // file names
    private static final String FILE_IN = TASK_NAME_FOR_IO + ".in";
    private static final String FILE_OUT = TASK_NAME_FOR_IO + ".out";

    BufferedReader in;
    PrintWriter out;
    StringTokenizer tokenizer = new StringTokenizer("");

    public static void main(String[] args) {
        new Thread(new C()).start();
    }

    class Vector implements Comparable<Vector> {
        long x, y;

        Vector(long x, long y) {
            this.x = x;
            this.y = y;
        }

        long skalMul(Vector that) {
            return this.x * that.x + this.y * that.y;
        }

        double length() {
            return Math.sqrt(this.x * this.x + this.y * this.y);
        }

        Vector vSum(long c, Vector that) {
            return new Vector(this.x + c * that.x, this.y + c * that.y);
        }

        long vectMul(Vector that) {
            return this.x * that.y - that.x * this.y;
        }

        public int compareTo(Vector that) {
            if (this.x < that.x) return -1;
            if (this.x > that.x) return 1;
            if (this.y < that.y) return -1;
            if (this.y > that.y) return 1;
            return 0;
        }

        public String toString() {
            return x + " " + y;
        }
    }

    class ConvCmp implements Comparator<Vector> {

        public int compare(Vector p1, Vector p2) {
            long v = p1.vectMul(p2);
            if (v < 0) return 1;
            if (v > 0) return -1;
            if (p1.length() < p2.length()) return 1;
            if (p1.length() > p2.length()) return -1;
            return 0;
        }
    }

    int differentPoints = 0;

    Vector[] convexHull(Vector[] p) {
        // argument p is invalid after calling this method
        if (p.length == 0) {
            differentPoints = 0;
            return new Vector[]{};
        }
        if (p.length == 1) {
            differentPoints = 1;
            return new Vector[]{new Vector(p[0].x, p[0].y)};
        }

        Arrays.sort(p);
        int n = 1;
        for (int i = 1; i < p.length; i++) {
            if (p[n - 1].compareTo(p[i]) != 0) {
                p[n++] = p[i];
            }
        }

        int first = 0;
        for (int i = 1; i < n; i++) {
            if (p[i].y < p[first].y
                    || (Math.abs(p[i].y - p[first].y) <= 0 && p[i].x < p[first].x)) {
                first = i;
            }
        }
        Vector tmp = p[0];
        p[0] = p[first];
        p[first] = tmp;

        Vector p0 = p[0];
        for (int i = 0; i < n; i++) {
            p[i] = p[i].vSum(-1, p0);
        }

        Arrays.sort(p, 1, n, new ConvCmp());
        int j = 2;
        for (int i = 2; i < n; i++) {
            if (Math.abs(p[j - 1].vectMul(p[i])) > 0) {
                p[j++] = p[i];
            }
        }
        n = j;

        if (n <= 2) {
            Vector[] res = new Vector[n];
            for (int i = 0; i < n; i++) {
                res[i] = p[i];
            }

            if (n == 2 && res[0].compareTo(res[1]) == 0) {
                n = 1;
                Vector single = res[0];
                res = new Vector[n];
                res[0] = single;
            }

            differentPoints = n;
            return res;
        }

        int[] a = new int[n];
        int cnt = 3;
        a[0] = 0;
        a[1] = 1;
        a[2] = 2;
        for (int i = 3; i < n; i++) {
            while (p[a[cnt - 1]].vSum(-1, p[a[cnt - 2]]).vectMul(
                    p[i].vSum(-1, p[a[cnt - 1]])) <= 0)
                cnt--;
            a[cnt++] = i;
        }
        Vector[] res = new Vector[cnt];
        for (int i = 0; i < cnt; i++) {
            res[i] = p0.vSum(1, p[a[i]]);
        }

        for (int i = 0; i < cnt; i++) {
            j = (i + 1) % cnt;
            int k = (j + 1) % cnt;
            if (Math.abs(res[j].vSum(-1, res[i]).vectMul(res[k].vSum(-1, res[j]))) <= 0) {
                throw new IllegalStateException("Three in a line");
            }
        }

        differentPoints = res.length;

        return res;
    }


    long answer;
    Vector[] a, res;

    private void solve() throws IOException {
        int n = nextInt();
        a = new Vector[n * 4];
        int idx = 0;
        for (int i = 0; i < n; i++) {
            int x = nextInt();
            int y = nextInt();
            a[idx++] = new Vector(x - 1, y);
            a[idx++] = new Vector(x + 1, y);
            a[idx++] = new Vector(x, y - 1);
            a[idx++] = new Vector(x, y + 1);
        }

        res = convexHull(a);
        answer = 0;
        for (int i = 0; i < res.length - 1; i++) {
            answer += getAnsWise(res[i], res[i + 1]);
        }
        answer += getAnsWise(res[res.length - 1], res[0]);

        /*
        if (differentPoints == 1) {
            answer = 4;
        } else if (differentPoints == 2) {

            answer = 2 * getAns(res[0], res[1]);
            if (zeroDx(res[0], res[1]) || zeroDy(res[0], res[1])) {
                answer += 2;
            }

        } else {
            answer = 0;
            for (int i = 0; i < res.length - 1; i++) {
                answer += getAns(res[i], res[i + 1]);
            }
            answer += getAns(res[res.length - 1], res[0]);
        }*/

        out.print(answer);
    }


    private long getAnsWise(Vector u, Vector v) {
        long dx = Math.abs(u.x - v.x);
        long dy = Math.abs(u.y - v.y);
        return Math.max(dx, dy);
    }

    /*
    private boolean zeroDx(Vector u, Vector v) {
        long dx = Math.abs(u.x - v.x);
        return dx == 0;
    }

    private boolean zeroDy(Vector u, Vector v) {
        long dy = Math.abs(u.y - v.y);
        return dy == 0;
    }

    private long getAns(Vector u, Vector v) {
        long dx = Math.abs(u.x - v.x);
        long dy = Math.abs(u.y - v.y);
        if (dx == 0) return dy + 1;
        if (dy == 0) return dx + 1;
        return Math.max(dx, dy) + 2;
    }*/

    public void run() {
        long timeStart = System.currentTimeMillis();
        try {

            if (TASK_NAME_FOR_IO.length() > 0) {
                in = new BufferedReader(new FileReader(FILE_IN));
                out = new PrintWriter(new FileWriter(FILE_OUT));
            } else {
                in = new BufferedReader(new InputStreamReader(System.in));
                out = new PrintWriter(new OutputStreamWriter(System.out));
            }

            solve();

            in.close();
            out.close();
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
        long timeEnd = System.currentTimeMillis();
        System.out.println("Time spent: " + (timeEnd - timeStart) + " ms");
    }

    private String nextToken() throws IOException {
        while (!tokenizer.hasMoreTokens()) {
            String line = in.readLine();
            if (line == null) {
                return null;
            }
            tokenizer = new StringTokenizer(line);
        }
        return tokenizer.nextToken();
    }

    private int nextInt() throws IOException {
        return Integer.parseInt(nextToken());
    }

    private BigInteger nextBigInt() throws IOException {
        return new BigInteger(nextToken());
    }

    private long nextLong() throws IOException {
        return Long.parseLong(nextToken());
    }

    private double nextDouble() throws IOException {
        return Double.parseDouble(nextToken());
    }

}