#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct tacka {
    int x, y;
    bool operator<(tacka t) {
        return x<t.x || (x==t.x && y<t.y);
    }
};

vector<tacka> omotac(vector<tacka> v) {
    int pom;
    sort(v.begin(), v.end());
    vector<tacka> omotac;
    for (int i=0; i<2; i++) {
        pom=omotac.size();
        for (tacka t : v) {
            while (omotac.size()>=pom+2 && (long long)(omotac.back().x-omotac[omotac.size()-2].x)*(t.y-omotac[omotac.size()-2].y)-(long long)(omotac.back().y-omotac[omotac.size()-2].y)*(t.x-omotac[omotac.size()-2].x)<0) omotac.pop_back();
            omotac.push_back(t);
        }
        reverse(v.begin(), v.end());
    }
    omotac.pop_back();
    return omotac;
}

long long povrsina(const vector<tacka> omotac) {
    long long p=0;
    int n=omotac.size();
    for (int i=0; i<n; i++) p+=(long long)omotac[i].x*omotac[(i+1)%n].y-(long long)omotac[i].y*omotac[(i+1)%n].x;
    return abs(p)/2;
}

int main() {
    int n;
    scanf("%d", &n);
    vector<tacka> tacke(n);
    for (int i=0; i<n; i++) scanf("%d %d", &tacke[i].x, &tacke[i].y);
    vector<tacka> pom, potpun_omotac = omotac(tacke);
    long long min=povrsina(potpun_omotac);
    for (tacka t1 : potpun_omotac) {
        pom.clear();
        for (tacka t2 : tacke) {
            if (!(t2.x==t1.x && t2.y==t1.y)) {
                pom.push_back(t2);
            }
        }
        vector<tacka> skoro_omotac=omotac(pom);
        min=std::min(min, povrsina(skoro_omotac));
    }
    printf("%d", min);
    return 0;
}