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: Runtime Error)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class Program
{
    public static bool f = false, t = true;
    static void Main(string[] args)
    {
        long n = long.Parse(Console.ReadLine());
        long[] a = Read.longs();
   //    long[] x = new long[100000000];
     //   for(long i=0;i<n; i++)
        {
       //     x[a[i]]++;
        }
       long[] x = new long[a.Max()];
        Array.Sort(a);
        for(long i = 0; i < a.Length; i++)
        {
            x[a[i] - 1]++;
        }
        long ans = 1;
       long katahouOK = 0;
        long eranda1 = 0;
        for(long i = a.Length-1; i >= 0; i--)
        {
            if (x[a[i] - 1] >= 2)
            {
                if (eranda1 == a[i] - 1) { continue; }
                else
                {
                    eranda1 = 0;
                }
                if (katahouOK == 1) { ans *= a[i];
                    Console.WriteLine((ans));
                    Console.ReadLine(); return; }
                if (katahouOK == 0)
                {
                    ans *= a[i] ;
                    eranda1=a[i]-1;
                    if (x[a[i] - 1] >= 4)
                    {
                        ans *= a[i];
                        Console.WriteLine(Math.Sqrt(ans));Console.ReadLine(); return;
                    }
                    katahouOK++;
                }
            }
        }
        Console.WriteLine(0);
        Console.ReadLine();
    }
    public static long gcd(long a, long b)
    {
        while (true)
        {
            if (a == 0) { return b; }
            if (b == 0) { return a; }
            if (a > b) { a -= b; }
            else { b -= a; }
        }
    }
    public static long lcm(long a, long b)
    {
        return a / gcd(a, b) * b;
    }
    public static bool IsPrime(long n)
    {
        if (n < 2) return false;
        if (n == 2) return true;

        for (long i = 2; i < Math.Sqrt(n); i++)
        {
            if (n % i == 0) return false;
        }
        return true;
    }

}
public static class Read
{
    public static void outl(string n = "") { Console.WriteLine(n); return; }
    public static long Long()
    {
        return long.Parse(Console.ReadLine());
    }
    public static long[] longs()
    {
        return Console.ReadLine().Split().Select(long.Parse).ToArray();
    }
    public static int Int()
    {
        return int.Parse(Console.ReadLine());
    }
    public static int[] ints()
    {
        return Console.ReadLine().Split().Select(int.Parse).ToArray();
    }
    public static string Str() { return Console.ReadLine(); }
    public static string[] Strs() { return Console.ReadLine().Split(); }
}