#include using namespace std; using ll = long long; using ull = unsigned long long; vector taken; int num_taken = 0; int find_next(int point, vector> &pos, int dir) { while(taken[pos[point].second]) point += dir; return point; } void take(int pos, vector> &poss, int which) { taken[poss[pos].second] = true; num_taken++; } int main() { ios::sync_with_stdio(0); cin.tie(0); int N; cin >> N; vector> xpos(N); vector> ypos(N); vector> points(N); taken.resize(N); for (int i = 0; i < N; i++) { int x, y; cin >> x >> y; xpos[i] = {x, i}; ypos[i] = {y, i}; points[i] = {x, y}; } sort(xpos.begin(), xpos.end()); sort(ypos.begin(), ypos.end()); int xl = 0, yl = 0; int xr = N-1, yr = N-1; while (num_taken < N-4) { xl = find_next(xl, xpos, 1); take(xl, xpos, 0); int nxl = find_next(xl, xpos, 1); if (xpos[xl].first == xpos[nxl].first) { take(nxl, xpos, 0); } else { xr = find_next(xr, xpos, -1); take(xr, xpos, 0); } yl = find_next(yl, ypos, 1); take(yl, ypos, 1); yr = find_next(yr, ypos, -1); take(yr, ypos, 1); } vector> good_points; for (int i = 0; i < 4; i++) { xl = find_next(xl, xpos, 1); take(xl, xpos, 1); good_points.push_back(points[xpos[xl].second]); } ll minx = good_points[0].first, maxx = minx; ll miny = good_points[0].second, maxy = miny; ll area = 0; for (int i = 0; i < 4; i++) { if (good_points[0].first != good_points[1].first && (i == 1 || i == 2)) { ll dx = good_points[i].first - good_points[0].first; ll dy = abs(good_points[i].second - good_points[0].second); area -= dx*dy; } minx = min((ll) good_points[i].first, minx); maxx = max((ll) good_points[i].first, maxx); miny = min((ll) good_points[i].second, miny); maxy = max((ll) good_points[i].second, maxy); } //cerr << minx << " " << maxx << " " << miny << " " << maxy << "\n"; area += (maxx - minx)*(maxy - miny); cout << area << "\n"; return 0; }