#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
mt19937 rng(time(0));
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};}
	bool operator ==(Point A){return x==A.x&&y==A.y;}
	bool operator <(Point A){return x<A.x||(x==A.x&&y<A.y);}
	bool operator <(const Point A)const{return x<A.x||(x==A.x&&y<A.y);}
};
vector<Point>Unique(vector<Point>a){sort(a.begin(),a.end());int m=unique(a.begin(),a.end())-a.begin();a.resize(m);return a;}
int n;Point 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);}
bool collinear(Point A,Point B,Point C){return cross(C-B,A-B)==0;}
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]);
	sort(a.begin()+1,a.end(),[&](Point X,Point Y){return ck(Y,O,X);});
	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;
}
ll res;
vector<Point>CH;int Idx;
map<Point,bool>mapa;
map<Point,vector<Point>>tacke;
void Solve(){
	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].x>=CH[i-1].x) Idx=i;}
	//printf("%i\n",Idx);
	for(auto i:CH){mapa[i]=true;}
	for(int i=1;i<=n;i++){
		if(mapa[a[i]]) 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;
		}
		int m=CH.size();
		Point A=CH[(ind-1+m)%m],B=CH[ind],C=CH[(ind+1+m)%m],D=CH[(ind+2+m)%m];
		//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].pb(a[i]);
		if(InTriangle(B,C,D,a[i])) tacke[C].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;
		}
		A=CH[(ind-1+m)%m],B=CH[ind],C=CH[(ind+1+m)%m],D=CH[(ind+2+m)%m];
		//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].pb(a[i]);
		if(InTriangle(B,C,D,a[i])) tacke[C].pb(a[i]);
	}
	res=0;
	for(int i=0,m=CH.size();i<CH.size();i++){
		Point A=CH[(i-1+m)%m],B=CH[i],C=CH[(i+1+m)%m];
		tacke[B].pb(A);tacke[B].pb(C);
		tacke[B]=Unique(tacke[B]);
		//for(auto j:tacke[B]) printf("{%lld %lld} ",j.x,j.y);printf("\n");
		vector<Point>temp=ConvexHull(tacke[B]);
		res=max(res,Area({A,B,C})-Area(temp));
	}
	res=Area(CH)-res;
	//printf("%lld\n",res);
}
ll res1;
void Bruteforce(){
	vector<Point>a1;
	for(int i=1;i<=n;i++) a1.pb(a[i]);
	res1=Area(ConvexHull(a1));
	for(int i=1;i<=n;i++){
		a1.clear();
		for(int j=1;j<=n;j++) if(j!=i) a1.pb(a[j]);
		res1=min(res1,Area(ConvexHull(a1)));
	}
}
bool nadjen;
void Uporedi(){
	if(res!=res1){
		printf("%i\n",n);
		for(int i=1;i<=n;i++) printf("%lld %lld\n",a[i].x,a[i].y);
		printf("%lld %lld\n",res,res1);
		nadjen=true;
	}
}
void Gen(){
	for(int i=0;i<=n+5;i++) a[i]={0,0};n=0;
	n=10;ll najveci=500000;
	for(int i=1;i<=n;i++){
		while(1){
			a[i].x=(rng()%najveci)*2,a[i].y=(rng()%najveci)*2;
			bool bul=false;
			for(int j=1;j<i;j++){
				for(int k=j+1;k<i;k++){
					if(collinear(a[i],a[j],a[k])) bul=true;
				}
			}
			if(!bul) break;
		}
	}
}
void CLEAR(){
	for(int i=0;i<=n+5;i++) a[i]={0,0};n=0;
	res=0;
	CH.clear();Idx=0;
	mapa.clear();tacke.clear();
	res1=0;
}
int main(){
    scanf("%i",&n);for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
    //int CT=0;while(!nadjen&&++CT){if(CT)printf("radi\n");Gen();Bruteforce();Solve();Uporedi();CLEAR();}
	//Bruteforce();printf("%lld\n",res1);
	Solve();printf("%lld\n",res);
    return 0;
}