//题意:给出n个点用长方形来覆盖,每个点能被多个矩形覆盖,矩形的边是平行于轴线的每个矩阵至少覆盖2个点(包括边界上的点)
//因为所有矩阵有个整体尺寸如何选择矩形让总体面积最小
//要覆盖两个点的最小面积矩形是两个点都在对角线上
//因为所有矩阵有个整体尺寸如何选择矩形让总体面积最小
//要覆盖两个点的最小面积矩形是两个点都在对角线上
//444K 125MS
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
#define MAX_N 16
static int dp[1<<MAX_N];//每个状态下的面积和的个数
static int x[MAX_N];
static int y[MAX_N];
static struct Rect{
int coverd;//包含的点集
int area;
Rect(const int&cd,const int&a):coverd(cd),area(a){
}
void add(int i){
coverd = coverd|(1<<i);
}
};
//计算两个点对应的矩形的面积
int calcArea(int index1,int index2){
//若平行于轴的坐标那么取边长为1
int l = max(1, (int const &) abs(x[index1] - x[index2]));
int h = max(1, (int const &) abs(y[index1] - y[index2]));
return l*h;
}
//检查是否在矩形的内部
bool InsideRectangle(int i,int j,int k){
return ((x[i]-x[k])*(x[j]-x[k])<=0)&&((y[i]-y[k])*(y[j]-y[k])<=0);
}
void Minmum_Rec_Reas(int n){
//初始化前2个点对应的矩形面积
vector<Rect>rarray;
for (int i=0;i<n;++i)
for (int j=i+1;j<n;++j)
{
//状态为2点的最小面积
Rect r((1 << i) | (1 << j), calcArea(i,j));
//检查在内部的点
for (int k=0;k<n;++k)
{
if (InsideRectangle(i,j,k))
r.add(k);
}
rarray.push_back(r);
}
memset(dp,0x3f,sizeof(dp));
dp[0] =0;
//然后每一个矩形加入
vector<Rect>::iterator iter = rarray.begin();
for (iter;iter!=rarray.end();++iter)
{
//遍历所有的状态
for (int s=(1<<n)-1;s>=0;s--)
{
int ns = s|iter->coverd;
if (dp[s]!=0x3f3f3f3f&&ns!=s)
dp[ns] = min(dp[ns],dp[s] + iter->area);
}
}
printf("%d\n",dp[(1<<n)-1]);
}
int main(){
int n;
while(scanf("%d",&n)&&n){
for (int i=0;i<n;++i)
scanf("%d %d",&x[i],&y[i]);
Minmum_Rec_Reas(n);
}
return 0;
}