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 (Clang 3.8.0) (judge verdict: Accepted)

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdint.h>
#include <string.h>
#include <wchar.h>

#define MIN(a, b) (a < b ? a : b)
#define MAX(a, b) (a > b ? a : b)
#define ABSS(a, b) (a > b ? a - b : b - a)

static uint32_t A[100000];

int compare_int(const void *a, const void *b) {
	return (int)((int32_t)*((uint32_t *)b) - (int32_t)*((uint32_t *)a));
}

int main(void) {
	uint32_t N;

	scanf("%"PRIu32"\n", &N);
	for (uint32_t idx = 0; idx < N; idx++) {
		scanf(idx != N - 1 ? "%"PRIu32" " : "%"PRIu32, &(A[idx]));
	}

	qsort(A, N, sizeof(uint32_t), compare_int);

	uint32_t bar[3] = { 0,0,0 };
	size_t pos = 0;
	size_t sameNumCount = 1;
	for (size_t i = 1; i < N && pos < 2; i++) {
		if (A[i] == A[i - 1]) {
			sameNumCount++;
		}
		if (A[i] != A[i - 1] || i == N - 1) {
			if (2 <= sameNumCount && sameNumCount < 4) {
				bar[pos] = A[i - 1];
				pos++;
			}
			else if (sameNumCount >= 4) {
				bar[pos] = A[i - 1];
				bar[pos + 1] = A[i - 1];
				pos += 2;
			}

			sameNumCount = 1;
		}
	}

	printf("%"PRIu64"\n", (uint64_t)(bar[0])*(uint64_t)(bar[1]));

	return 0;
}