#include <bits/stdc++.h>
#define ubrzaj ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;

struct Tacke{
    long long x,y;
    bool operator<(const Tacke& ostalo) const{
        return (tie(x, y)<tie(ostalo.x,ostalo.y));
    }
    bool operator==(const Tacke& ostalo) const{
        return (x==ostalo.x && y==ostalo.y);
    }
};

long long x(const Tacke& O,const Tacke& A,const Tacke& B){
    return ((A.x-O.x)*(B.y-O.y)-(A.y-O.y)*(B.x-O.x));
}

vector<Tacke> konveksni(vector<Tacke>& tacke){
    sort(tacke.begin(),tacke.end());
    vector<Tacke> omotac;

    for(const auto& p:tacke){
        while (omotac.size()>=2 && x(omotac[omotac.size()-2], omotac[omotac.size()-1],p)<=0){//>=
        omotac.pop_back();}
        omotac.push_back(p);
    }

    auto b=omotac.size();
    for(int i=tacke.size()-1; i>=0; i--){
        while(omotac.size()>b && x(omotac[omotac.size()-2],omotac[omotac.size()-1],tacke[i])<=0){//>=
        omotac.pop_back();}
        omotac.push_back(tacke[i]);
    }

    omotac.pop_back();
    return omotac;
}

long long povrsina(const vector<Tacke>& poli){
    long long povrsina=0;
    for(auto i=0; i<poli.size(); i++){
        auto j=(i+1)%poli.size();
        povrsina+=poli[i].x*poli[j].y-poli[j].x*poli[i].y;}
    return abs(povrsina)/2;
}


int main(){

    ubrzaj
    int n;
    cin >> n;
    vector<Tacke> tacke(n);
    for (int i=0; i<n; i++){cin >> tacke[i].x >> tacke[i].y;}
    //for (int i=0; i<n; i++){cin >> tacke[i].x >> tacke[i].y;}

    vector<Tacke> omotac=konveksni(tacke);
    long long minPovrs=LLONG_MAX;

    for(const auto& izostavi:omotac) {
        vector<Tacke> k;
        for(const auto& p:tacke)if(!(p==izostavi)){k.push_back(p);}
        vector<Tacke> l=konveksni(k);
        minPovrs=min(minPovrs,povrsina(l));
    }

    cout << minPovrs << endl;
    return 0;
}