#include <bits/stdc++.h>
using namespace std;

#define int long long
set<array<int,2>>hull;
int mxrz;

int fs(array<int,2>p1,array<int,2>p2,array<int,2>p){
    int c=(p[1]-p1[1])*(p2[0]-p1[0])-(p2[1]-p1[1])*(p[0]-p1[0]);
    if(c>0)
        return 1;
    if(c<0)
        return -1;
    return 0;
}

int dist(array<int,2>p1,array<int,2>p2,array<int,2>p){
    return abs((p[1]-p1[1])*(p2[0]-p1[0])-(p2[1]-p1[1])*(p[0]-p1[0]));
}

set<array<int,2>>thull;

void calcdeo(vector<array<int,2>>a,int n,array<int,2>p1,array<int,2>p2,int str){
    int mx=0,id=-1;
    for(int i=0;i<n;++i){
        int dd=dist(p1,p2,a[i]),ff=(fs(p1,p2,a[i])==str);
        if(ff&&dd>=mx){
            mx=dd;
            id=i;
        }
    }
    if(id==-1){
        thull.insert(p1);
        thull.insert(p2);
        return;
    }
    calcdeo(a,n,a[id],p1,-fs(a[id],p1,p2));
    calcdeo(a,n,a[id],p2,-fs(a[id],p2,p1));
}

int orient(const array<int,2>&p,const array<int,2>&q,const array<int,2>&r){
    return (q[1]-p[1])*(r[0]-q[0])-(q[0]-p[0])*(r[1]-q[1]);
}

int dist2(const array<int,2>&p,const array<int,2>&q){
    return (p[0]-q[0])*(p[0]-q[0])+(p[1]-q[1])*(p[1]-q[1]);
}

bool cmp(const array<int,2>&p1,const array<int,2>&p2,const array<int,2>&pivot){
    int o=orient(pivot,p1,p2);
    if(!o) 
        return dist2(pivot,p1)<dist2(pivot,p2);
    return o>0;
}

int calcP(vector<array<int,2>>tacke){
	array<int,2>pivot=*min_element(tacke.begin(),tacke.end(),[](const array<int,2>&a,const array<int,2>&b){
        return a[1]<b[1]||(a[1]==b[1]&&a[0]<b[0]);
    });
    sort(tacke.begin(),tacke.end(),[&pivot](const array<int,2>&p1,const array<int,2>&p2){
        return cmp(p1,p2,pivot);
    });
    reverse(tacke.begin(),tacke.end());
    int n=tacke.size(),res=0,j=n-1;
    for(int i=0;i<n;++i){
    	res+=(tacke[i][0]+tacke[j][0])*(tacke[j][1]-tacke[i][1]);
    	j=i;
    }
    return abs(res)/2;
}

int getdeo(vector<array<int,2>>a,int n){
	thull.clear();
	int min_x=0,max_x=0;
    for(int i=1;i<n;++i){
        if(a[i][0]<a[min_x][0])
            min_x=i;
        if(a[i][0]>a[max_x][0])
            max_x=i;
    }
    calcdeo(a,n,a[min_x],a[max_x],1);
    calcdeo(a,n,a[min_x],a[max_x],-1);
    vector<array<int,2>>full;
    for(auto el:thull)
    	full.push_back(el);
    return calcP(full);
}

void calc(vector<array<int,2>>a,int n,array<int,2>p1,array<int,2>p2,int str){
    int mx=0,id=-1,scmx=0,scid=-1;
    for(int i=0;i<n;++i){
        int dd=dist(p1,p2,a[i]),ff=(fs(p1,p2,a[i])==str);
        if(ff&&dd>=mx){
        	scid=id;
        	scmx=mx;
            mx=dd;
            id=i;
        }else if(ff&&dd>=scmx){
        	scmx=dd;
        	scid=i;
        }
    }
    if(id==-1){
        hull.insert(p1);
        hull.insert(p2);
        return;
    }
	vector<array<int,2>>tacke={p1,p2};
	for(int i=0;i<n;++i){
		if(i!=id&&fs(p1,p2,a[i])==str)
			tacke.push_back(a[i]);
	}
	int P1=(scid==-1?0ll:getdeo(tacke,(int)tacke.size()));
	tacke.push_back(a[id]);
	int P2=getdeo(tacke,(int)tacke.size());
	mxrz=max(mxrz,P2-P1);
    calc(a,n,a[id],p1,-fs(a[id],p1,p2));
    calc(a,n,a[id],p2,-fs(a[id],p2,p1));
}
 
int get(vector<array<int,2>>a,int n){
	hull.clear();
    int min_x=0,max_x=0;
    for(int i=1;i<n;++i){
        if(a[i][0]<a[min_x][0])
            min_x=i;
        if(a[i][0]>a[max_x][0])
            max_x=i;
    }
    calc(a,n,a[min_x],a[max_x],1);
    calc(a,n,a[min_x],a[max_x],-1);
    vector<array<int,2>>full;
    for(auto el:hull)
    	full.push_back(el);
    return calcP(full);
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
  	int n;
  	cin>>n;
    vector<array<int,2>>a;
    for(int i=0;i<n;++i){
    	int x,y;
    	cin>>x>>y;
    	a.push_back({x,y});
    }

    int ans=get(a,n)-mxrz;

    int min_x=0,max_x=0;
    for(int i=1;i<n;++i){
        if(a[i][0]<a[min_x][0])
            min_x=i;
        if(a[i][0]>a[max_x][0])
            max_x=i;
    }

    array<int,2>tmp=a[min_x];
    a.erase(a.begin()+min_x);

    ans=min(ans,getdeo(a,n-1));
    a.push_back(tmp);

    min_x=0,max_x=0;
    for(int i=1;i<n;++i){
        if(a[i][0]<a[min_x][0])
            min_x=i;
        if(a[i][0]>a[max_x][0])
            max_x=i;
    }

    a.erase(a.begin()+max_x);
    ans=min(ans,getdeo(a,n-1));

    cout<<ans;
}