#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define F0R(i,a) FOR(i,0,a)
#define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
#define R0F(i,a) ROF(i,0,a)
#define run int teodorfonburgjenasgospodar; cin >> teodorfonburgjenasgospodar; while (teodorfonburgjenasgospodar--)
#define f first
#define s second
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define pb push_back
#define yes cout << "YES\n";
#define no cout << "NO\n";
#define cintienull ios_base::sync_with_stdio(0); cin.tie(0);
#define mp make_pair
#define inputV(a, n) for(int i = 0; i < n; i++)cin>>a[i];
#define ov(a, n) for(int i = 0; i < n; i++)cout << a[i] << " ";
#define ovr(a, n) for(int i = 0; i < n; i++)cout << a[i] << "\n";
#define INF 1000000000
#define LINF 1000000000000000000LL
#define EPS 1e-9
#define MOD 1000000007;

int n;
struct Point {
    ll x, y;

    bool operator<(const Point& other) const {
        return x < other.x || (x == other.x && y < other.y);
    }
};

ll cross(const Point& O, const Point& A, const Point& B) {
    return (A.x - O.x) * (B.y - O.y) - (A.y - O.y) * (B.x - O.x);
}

vector<Point> convexHull(vector<Point>& points) {
    int n = points.size();
    if (n <= 3) return points;

    sort(points.begin(), points.end());

    vector<Point> hull;

    // donja
    for (int i = 0; i < n; ++i) {
        while (hull.size() >= 2 && cross(hull[hull.size() - 2], hull[hull.size() - 1], points[i]) <= 0) {
            hull.pop_back();
        }
        hull.push_back(points[i]);
    }

    // gornja
    int lower_size = hull.size();
    for (int i = n - 2; i >= 0; --i) {
        while (hull.size() > lower_size && cross(hull[hull.size() - 2], hull[hull.size() - 1], points[i]) <= 0) {
            hull.pop_back();
        }
        hull.push_back(points[i]);
    }

    hull.pop_back(); // dupli
    return hull;
}

ll polygonArea(const vector<Point>& polygon) {
    ll area = 0;
    int n = polygon.size();

    for (int i = 0; i < n; ++i) {
        const Point& p1 = polygon[i];
        const Point& p2 = polygon[(i + 1) % n];
        area += p1.x * p2.y - p1.y * p2.x;
    }

    return abs(area) / 2;
}

ll convexAlmostHull(vector<Point>& points) {

    ll minArea = LLONG_MAX;
    for (int i = 0; i < n; ++i) {
        vector<Point> reducedHull;

        for (int j = 0; j <n; ++j) {
            if (i != j) {
                reducedHull.push_back(points[j]);
            }
        }
        reducedHull = convexHull(reducedHull);
        minArea = min(minArea, polygonArea(reducedHull));
    }

    return minArea;
}

int main() {
    cintienull
    cin >> n;
    vector<Point> points(n);
    for (int i = 0; i < n; ++i) {
        cin >> points[i].x >> points[i].y;
    }
    cout << convexAlmostHull(points) << endl;
    return 0;
}