#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cctype>

#include <iostream>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;

#define rep(i, n) for(int i = 0; i < n; i++)
#define repi(i,l,n) for(int (i)=(int)(l);(i)<(int)(n);(i)++)
#define d_arr(arr, h, w) rep(i,(h) ){ cout << "["; rep(j,(w) ) { cout << (arr)[i][j] << ", "; } cout << "]" << endl;}
#define IN(x,s,g) ((x) >= (s) && (x) < (g))
#define ISIN(x,y,w,h) (IN((x),0,(w)) && IN((y),0,(h)))
#define print(x) printf("%d\n",x);

typedef pair<int ,int> P;

/*
1行目 カードの山の個数n(100以下の正の整数)
2行目 左から1番目の山の情報 a b（整数；半角空白区切り）
a 山の1番上のカードに書かれた数
b 山の1番下のカードに書かれた数
3行目 左から2番目の山の情報a b（整数；半角空白区切り）
：
：
n+1行目 左からn番目の山の情報a b（整数；半角空白区切り）
 */


//dp[l][r] = index-lから始まって、index-rで終わる配列の最小値コスト
//

int dp[100][100] = {0};

int main()
{
    int n;
    cin >> n;
    vector<int> a,b;
    rep(i,n) 
    {
        int tmp;
        cin >> tmp;
        a.push_back(tmp);
        cin >> tmp;
        b.push_back(tmp);
    }

    rep(i,100){ rep(j,100){ dp[i][j] = 100000; } }
    rep(i,100){  dp[i][i+1] = 0;  }
    repi(len,1,a.size()+1)
    {
        rep(l,n)
        {
            if( n  < l + len  ) { break; }
            int r = l + len;
            repi(m,l+1,r)
            {
                cout << "(m,l,r) = (" << m << "," << l << " " << r << ")" << endl;
                dp[l][r] = min(dp[l][r],  dp[l][m] + dp[m][r] + a[l]*b[m-1]*a[m]*b[r-1]);
            }
        }
    }
    //rep(i,n+1){
    //    rep(j,n+1){ 
    //    
    //        cout << dp[i][j] << ", ";
    //    } 
    //    cout << endl;
    //}
    cout << dp[0][n] << endl;
}