// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;



typedef long long LL;

inline LL sqr(const LL &v) { return v * v; }



struct PT

{

	LL x, y;

	PT(LL x = 0, LL y = 0) : x(x), y(y) {}

	PT operator+(const PT &d) const { return PT(x + d.x, y + d.y); }

	PT& operator+=(const PT &d) { x += d.x, y += d.y; return *this; }

	PT operator-(const PT &d) const { return PT(x - d.x, y - d.y); }

	PT& operator-=(const PT &d) { x -= d.x, y -= d.y; return *this; }

	bool operator<(const PT &o) { return x != o.x ? x < o.x : y < o.y; }

};



LL norm2(const PT &v) { return sqr(v.x) + sqr(v.y); }

LL norm2(const PT &p1, const PT &p2) { return norm2(p1 - p2); }

LL vect(const PT &v1, const PT &v2) { return v1.x * v2.y - v2.x * v1.y; }

LL vect(const PT &p, const PT &p1, const PT &p2) { return vect(p1 - p, p2 - p); }



const int maxn = 100100;

int n, hn1, hn2, xn, x[maxn];

LL area, db1[maxn], db2[maxn];

PT p[maxn], h1[maxn], h2[maxn];



int main()

{

	int n;

	scanf("%d", &n);

	for (int i = 0; i < n; ++i) scanf("%lld%lld", &p[i].x, &p[i].y), x[xn++] = p[i].x;

	sort(p, p + n);

	sort(x, x + xn), xn = unique(x, x + xn) - x;

	hn1 = hn2 = area = 0;

	for (int i = 0, j; i < n;) {

		for (j = i; j < n; ++j) {

			if (p[i].x != p[j].x) break;

			for (; hn1 >= 2 && vect(h1[hn1 - 2], h1[hn1 - 1], p[j]) <= 0; --hn1)

				area -= vect(h1[hn1 - 2], h1[hn1 - 1]);

			if (hn1) area += vect(h1[hn1 - 1], p[j]);

			h1[hn1++] = p[j];

			for (; hn2 >= 2 && vect(p[j], h2[hn2 - 1], h2[hn2 - 2]) <= 0; --hn2)

				area -= vect(h2[hn2 - 1], h2[hn2 - 2]);

			if (hn2) area += vect(p[j], h2[hn2 - 1]);

			h2[hn2++] = p[j];

		}

		int id = lower_bound(x, x + xn, p[i].x) - x + 1;

		db1[id] = area;

		i = j;

	}

	hn1 = hn2 = area = 0;

	for (int i = n - 1, j; i >= 0;) {

		for (j = i; j >= 0; --j) {

			if (p[i].x != p[j].x) break;

			p[j].x = -p[j].x;

			for (; hn1 >= 2 && vect(h1[hn1 - 2], h1[hn1 - 1], p[j]) <= 0; --hn1)

				area -= vect(h1[hn1 - 2], h1[hn1 - 1]);

			if (hn1) area += vect(h1[hn1 - 1], p[j]);

			h1[hn1++] = p[j];

			for (; hn2 >= 2 && vect(p[j], h2[hn2 - 1], h2[hn2 - 2]) <= 0; --hn2)

				area -= vect(h2[hn2 - 1], h2[hn2 - 2]);

			if (hn2) area += vect(p[j], h2[hn2 - 1]);

			h2[hn2++] = p[j];

			p[j].x = -p[j].x;

		}

		int id = lower_bound(x, x + xn, p[i].x) - x + 1;

		db2[id] += area;

		i = j;

	}

	LL ans = 8e18;

	for (int i = 0; i <= xn; ++i) ans = min(ans, db1[i] + db2[i + 1]);

	printf("%lld\n", (ans + 1) / 2);

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 5.896962757113436x):
#include<iostream>

#include<cstring>

#include<string>

#include<cstdio>

#include<algorithm>

#define ll long long

using namespace std;

const int maxn=1e5+10;

struct Point{

    ll x,y;

    Point(){}

    Point(ll _x,ll _y):x(_x),y(_y){}

    bool operator < (const Point &P)const{

        return x<P.x||(x==P.x&&y<P.y);

    }

    Point operator - (const Point &P)const{

        return Point(x-P.x,y-P.y);

    }

    ll Cross(const Point & P)const{

        return x*P.y-y*P.x;

    }

    void pt(){printf("(%lld,%lld)\n",x,y);}

}p[maxn],cxh1[maxn],cxh2[maxn];

ll Area(Point P1,Point P2){return P1.Cross(P2);}

ll s1[maxn][2],s2[maxn][2];

Point down_Convexhull[maxn],up_Convexhull[maxn];

void solve(ll s[maxn][2],int n,bool rev){

    int top1=0,top2=0;

    for(int i=0;i<n;i++){

        if(i)s[i][0]=s[i-1][0],s[i][1]=s[i-1][1];

        while(top1>1&&(p[i]-down_Convexhull[top1-2]).Cross(down_Convexhull[top1-1]-down_Convexhull[top1-2])>=0){ //rev==0:下凸包

            s[i][0]-=Area(down_Convexhull[top1-2]-down_Convexhull[0],down_Convexhull[top1-1]-down_Convexhull[0]);top1--;

        }down_Convexhull[top1++]=p[i];

        if(top1>2)s[i][0]+=Area(down_Convexhull[top1-2]-down_Convexhull[0],down_Convexhull[top1-1]-down_Convexhull[0]);



        while(top2>1&&(up_Convexhull[top2-1]-up_Convexhull[top2-2]).Cross(p[i]-up_Convexhull[top2-2])>=0){ //rev==0:上凸包

            s[i][1]-=Area(up_Convexhull[top2-1]-up_Convexhull[0],up_Convexhull[top2-2]-up_Convexhull[0]);top2--;

        }up_Convexhull[top2++]=p[i];

        if(top2>2)s[i][1]+=Area(up_Convexhull[top2-1]-up_Convexhull[0],up_Convexhull[top2-2]-up_Convexhull[0]);

    }

    if(rev){

        for(int i=0;i<n/2;i++){

            swap(s[i][0],s[n-i-1][0]);

            swap(s[i][1],s[n-i-1][1]);

        }

    }

}

int main(){

  //  freopen("in.txt","r",stdin);

    int n;scanf("%d",&n);

    for(int i=0;i<n;i++){scanf("%lld%lld",&p[i].x,&p[i].y);}

    if(n<=3){printf("0\n");return 0;}sort(p,p+n);

    solve(s1,n,0);reverse(p,p+n);

    solve(s2,n,1);reverse(p,p+n);

//    for(int i=0;i<n;i++){

//        printf("%I64d %I64d\n",s1[i][0],s1[i][1]);

//    }cout<<"***************\n";

//    for(int i=0;i<n;i++){

//        printf("%I64d %I64d\n",s2[i][0],s2[i][1]);

//    }

    ll ans=s1[n-1][0]+s1[n-1][1];

    for(int i=0;i<n-1;i++){

        if(p[i].x==p[i+1].x)continue;

        ans=min(ans,s1[i][0]+s1[i][1]+s2[i+1][0]+s2[i+1][1]);

    }

    for(int i=n-1;i>0;i--){

        if(p[i].x==p[i-1].x)continue;

        ans=min(ans,s1[i-1][0]+s1[i-1][1]+s2[i][0]+s2[i][1]);

    }

    printf("%lld\n",ans/2+ans%2);

    return 0;

}