#include <iostream>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <map>
#include <cmath>
#include <cstring>
#include <complex>
#include <functional>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>

using namespace std;

#define fst first
#define snd second
#define all(c) ((c).begin()), ((c).end())

typedef complex<double> point;
namespace std {
bool operator < (point p, point q) {
  if (real(p) != real(q)) return real(p) < real(q);
  return imag(p) < imag(q);
}
};
double dot(point p, point q)   { return real(conj(p) * q); }
double cross(point p, point q) { return imag(conj(p) * q); }
double EPS = 1e-8;
int sign(double x) {
  if (x < -EPS) return -1;
  if (x > +EPS) return +1;
  return 0;
}

//
// triangulation of simple polygon in O(nr) time,
// where n is the number of points and r is the number of reflex vertices.
//
// Kong, Everett, and Toussaint's Graham Scan
//
struct triangulation {
  vector<point> P;
  void add_point(point p) { P.push_back(p); }

  vector<int> prev, next;
  unordered_set<int> R;
  bool is_ear(int i) {
    if (R.count(i)) return false;
    for (int j: R) 
      if (j != prev[i] && j != next[i] &&
          sign(cross(P[   i   ]-P[j], P[next[i]]-P[j])) >= 0 &&
          sign(cross(P[next[i]]-P[j], P[prev[i]]-P[j])) >= 0 &&
          sign(cross(P[prev[i]]-P[j], P[   i   ]-P[j])) >= 0) return false;
    return true;
  }
  void update(int i) {
    R.insert(i);
    if (sign(cross(P[prev[i]]-P[i], P[next[i]]-P[i])) <= 0) R.erase(i);
  }
  vector<vector<point>> tri;
  void run() {
    int n = P.size();
    prev.resize(n); next.resize(n);
    iota(all(prev), -1); prev[0] = n-1;
    iota(all(next), +1); next[n-1] = 0;
    for (int i = 0; i < n; ++i) update(i);
    for (int i = 0; next[i] != prev[i]; i = next[i]) {
      if (is_ear(i)) {
        tri.push_back({P[prev[i]], P[i], P[next[i]]});
        prev[next[i]] = prev[i]; 
        next[prev[i]] = next[i];
        update(prev[i]);
        update(next[i]);
      }
    }
  }
  double areaX(vector<point> ps) {
    double a = cross(ps.back(), ps[0]);
    for (int i = 1; i < ps.size(); ++i) 
      a += cross(ps[i-1], ps[i]);
    return a;
  }
  /*
  double area(vector<point> ps) {
    double a = cross(ps.back(), ps[0]);
    for (int i = 1; i < ps.size(); ++i) 
      a += cross(ps[i-1], ps[i]);
    return a;
  }
  void verify() {
    double area1 = 0;
    for (auto t: tri) 
      area1 += abs(area(t));
    assert(sign(area1 - abs(area(P))) == 0);
  }
  */
  double area() {
    double A = 0;
    for (auto t: tri) {
      A += abs(cross(t[1]-t[0],t[2]-t[0]));
    }
    return A/2;
  }
};


int main() {
  triangulation T;
  int n; cin >> n;
  while (n--) {
    double x, y;
    cin >> x >> y;
    T.add_point(point(x,y));
  }
  T.run();
  printf("%.1lf\n", T.area());
}

/*

int main() {
  {
    triangulation T;
    T.add_point( point(0,0) );
    T.add_point( point(2,0) );
    T.add_point( point(2,2) );
    T.add_point( point(1,1) );
    T.add_point( point(0,2) );
    T.run();
    T.verify();
  }
  {
    triangulation T;
    T.add_point( point(0,0) );
    T.add_point( point(4,0) );
    T.add_point( point(4,1) );
    T.add_point( point(3,1) );
    T.add_point( point(2,2) );
    T.add_point( point(1,1) );
    T.add_point( point(0,1) );
    T.run();
    T.verify();
  }
  {
    triangulation T;
    T.add_point( point(0,0) );
    T.add_point( point(2,0) );
    T.add_point( point(2,1) );
    T.add_point( point(1,1) );
    T.add_point( point(1,2) );
    T.add_point( point(4,2) );
    T.add_point( point(4,1) );
    T.add_point( point(3,1) );
    T.add_point( point(3,0) );
    T.add_point( point(5,0) );
    T.add_point( point(5,1) );
    T.add_point( point(5,5) );
    T.add_point( point(0,5) );
    T.run();
    T.verify();
  }
  {
    triangulation T;
    T.add_point( point(0,0) );
    T.add_point( point(1,0) );
    T.add_point( point(2,0) );
    T.add_point( point(2,1) );
    T.add_point( point(0,1) );
    T.run();
    T.verify();
  }
  {
    triangulation T;
    T.add_point( point(0,0) );
    T.add_point( point(2,0) );
    T.add_point( point(2,1) );
    T.add_point( point(1,1) );
    T.add_point( point(1,2) );
    T.add_point( point(4,2) );
    T.add_point( point(4,1) );
    T.add_point( point(3,1) );
    T.add_point( point(3,0) );
    T.add_point( point(5,0) );
    T.add_point( point(5,5) );
    T.add_point( point(0,5) );
    T.run();
    T.verify();
  }
}
*/

Measured memory_bytes: 1272