#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int N=1e5+50;
struct Point{
	ll x,y;
	Point operator +(Point A){return {x+A.x,y+A.y};}
	Point operator -(Point A){return {x-A.x,y-A.y};}
}a[N];
ll cross(Point A,Point B){return A.x*B.y-A.y*B.x;}
bool ck(Point A,Point B,Point C){return cross(C-B,A-B)>=0;}
bool cck(Point A,Point B,Point C){return !ck(A,B,C);}
ll Area(vector<Point>a){
	ll x=cross(a[0],a.back());
	for(int i=1;i<a.size();i++) x+=cross(a[i],a[i-1]);
	x/=2;
	return abs(x);
}
bool InTriangle(Point A,Point B,Point C,Point D){
	if(ck(D,A,B)&&ck(D,B,C)&&ck(D,C,A)) return true;
	if(cck(D,A,B)&&cck(D,B,C)&&cck(D,C,A)) return true;
	return false;
}
vector<Point> ConvexHull(vector<Point>a){
	Point O=a[0];
	for(int i=0;i<a.size();i++) if(O.x>a[i].x||(O.x==a[i].x&&O.y>a[i].y)) O=a[i],swap(a[0],a[i]);
	//for(int i=0;i<a.size();i++) a[i]=a[i]-O;
	sort(a.begin()+1,a.end(),[&](Point X,Point Y){return ck(Y,O,X);});
	//for(int i=0;i<a.size();i++) a[i]=a[i]+O;
	//printf("{%lld %lld}\n",O.x,O.y);
	//for(int i=1;i<=n;i++) printf("{%lld %lld} ",a[i].x,a[i].y);printf("\n");
	vector<Point>CH;
	for(int i=0;i<a.size();i++){
		while(CH.size()>=2&&cck(CH[CH.size()-2],CH.back(),a[i])) CH.pop_back();
		CH.pb(a[i]);
	}
	return CH;
}
int n;ll res;
vector<Point>CH;
int Idx;
map<pair<ll,ll>,bool>mapa;
map<pair<ll,ll>,vector<Point>>tacke;
int main(){
    scanf("%i",&n);
    for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
    vector<Point>a1;for(int i=1;i<=n;i++) a1.pb(a[i]);
    CH=ConvexHull(a1);
    //for(auto i:CH) printf("{%lld %lld} ",i.x,i.y);printf("\n");
	/*for(int i=1;i<CH.size();i++){
		if(CH[i-1].x<=CH[i].x){
			if(Lo.empty()) Lo.pb(CH[i-1]);
			Lo.pb(CH[i]);
		}
		else{
			if(Up.empty()) Up.pb(CH[i-1]);
			Up.pb(CH[i]);
		}
	}*/
	for(int i=1;i<CH.size();i++){
		if(CH[i].x>=CH[i-1].x) Idx=i;
	}
	//printf("%i\n",Idx);
	//for(auto i:Lo) printf("{%lld %lld} ",i.x,i.y);printf("\n");
	//for(auto i:Up) printf("{%lld %lld} ",i.x,i.y);printf("\n");
	for(auto i:CH){mapa[{i.x,i.y}]=true;}
	for(int i=1;i<=n;i++){
		if(mapa[{a[i].x,a[i].y}]) continue;
		int l=0,r=Idx,ind=0;
		while(l<=r){
			int mid=l+r>>1;
			if(CH[mid].x<=a[i].x){ind=mid;l=mid+1;}
			else r=mid-1;
		}
		Point A,B=CH[ind],C,D;
		if(ind>0) A=CH[ind-1];
		else A=CH.back();
		if(ind+1<CH.size()) C=CH[ind+1];
		else C=CH[ind+1-CH.size()];
		if(ind+2<CH.size()) D=CH[ind+2];
		else D=CH[ind+2-CH.size()];
		//printf("{%lld %lld} {%lld %lld}\n",B.x,B.y,C.x,C.y);
		//printf("%i %i\n",InTriangle(A,B,C,a[i]),InTriangle(B,C,D,a[i]));
		if(InTriangle(A,B,C,a[i])) tacke[{B.x,B.y}].pb(a[i]);
		if(InTriangle(B,C,D,a[i])) tacke[{C.x,C.y}].pb(a[i]);

		l=Idx,r=CH.size()-1,ind=Idx;
		while(l<=r){
			int mid=l+r>>1;
			if(CH[mid].x>=a[i].x){ind=mid;l=mid+1;}
			else r=mid-1;
		}
		B=CH[ind];
		if(ind>0) A=CH[ind-1];
		else A=CH.back();
		if(ind+1<CH.size()) C=CH[ind+1];
		else C=CH[ind+1-CH.size()];
		if(ind+2<CH.size()) D=CH[ind+2];
		else D=CH[ind+2-CH.size()];
		//printf("{%lld %lld} {%lld %lld}\n",B.x,B.y,C.x,C.y);
		//printf("%i %i\n",InTriangle(A,B,C,a[i]),InTriangle(B,C,D,a[i]));
		if(InTriangle(A,B,C,a[i])) tacke[{B.x,B.y}].pb(a[i]);
		if(InTriangle(B,C,D,a[i])) tacke[{C.x,C.y}].pb(a[i]);
	}
	res=0;
	for(int i=0;i<CH.size();i++){
		Point A,B=CH[i],C;
		if(i>0) A=CH[i-1];
		else A=CH.back();
		if(i+1<CH.size()) C=CH[i+1];
		else C=CH[0];
		tacke[{B.x,B.y}].pb(A);
		tacke[{B.x,B.y}].pb(C);
		//for(auto j:tacke[{B.x,B.y}]) printf("{%lld %lld} ",j.x,j.y);printf("\n");
		vector<Point>temp=ConvexHull(tacke[{B.x,B.y}]);
		res=max(res,Area({A,B,C})-Area(temp));
	}
	res=Area(CH)-res;
	printf("%lld\n",res);
    return 0;
}