Problem:
Score : 300 points

Problem Statement

We have N sticks with negligible thickness.
The length of the i-th stick is A_i.

Snuke wants to select four different sticks from these sticks and form a rectangle (including a square), using the sticks as its sides.
Find the maximum possible area of the rectangle.

Constraints

4 \leq N \leq 10^5

1 \leq A_i \leq 10^9

A_i is an integer.

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum possible area of the rectangle.
If no rectangle can be formed, print 0.

Sample Input 1

6
3 1 2 4 2 1

Sample Output 1

2

1 \times 2 rectangle can be formed.

Sample Input 2

4
1 2 3 4

Sample Output 2

0

No rectangle can be formed.

Sample Input 3

10
3 3 3 3 4 4 4 5 5 5

Sample Output 3

20

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<(n);++i)
#define ALL(A) A.begin(), A.end()

using namespace std;

typedef long long ll;
typedef pair<int, int> P;

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int N; cin >> N;
	vector<ll> a(N, 0LL);
	rep (i, N){
		cin >> a[i];
	} // end rep

	map<ll,int> cnt; cnt.clear();
	rep (i, N){
		++cnt[a[i]];
	} // end rep

	vector<ll> cand2; cand2.clear();
	vector<ll> cand4; cand4.clear();
	map<ll,int>::iterator it = cnt.begin();
	for (;it != cnt.end(); ++it){
		ll side = (*it).first;
		int c = (*it).second;
		if (c >= 2){
			cand2.push_back(side);
		} // end if
		if (c >= 4){
			cand4.push_back(side);
		} // end if
	} // end for

	ll res = 0LL;
	if (!cand2.empty()){
		sort(ALL(cand2), greater<ll>());
		if ((int)cand2.size() >= 2){
			res = max(res, cand2[0] * cand2[1]);
		} // end if
	} // end if

	if (!cand4.empty()){
		sort(ALL(cand4), greater<ll>());
		res = max(res, cand4[0] * cand4[0]);
	} // end if
	cout << res << endl;
 
	return 0;
}