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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// http://arc081.contest.atcoder.jp/tasks/arc081_a
/// </summary>
namespace _170821CS_MakeRectangle_Console {
    class Program {
        static void Main(string[] args) {
            //int[] map = { 3, 1, 2, 4, 2, 1 };
            //int[] map = { 1, 2, 3, 4 };
            //int[] map = { 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6 };
            //int[] map = Enumerable.Range(0, 100000).Select(x => x / 2).ToArray();
            int n = Convert.ToInt32(Console.ReadLine());
            string input = Console.ReadLine();
            var map = input.Split(' ').Select(x => Convert.ToInt32(x)).ToArray();
            long ans = Solve(map);
            Console.WriteLine(ans);
        }
        private static long Solve(int[] map) {
            var list = map.ToList();
            list.Sort();
            int p = 0;
            long[] ans = { 0, 0 };
            for(int i=list.Count - 1; i > 0; i--) {
                if(list[i] == list[i - 1]) {
                    ans[p++] = list[i--];
                }
                if (p == 2) break;
            }
            return ans[0] * ans[1];
        }
    }
}