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

#include<cstdio>
const int N=2005;
int l[N][N],r[N][N],h[N][N],n,m,ans,mp[N][N],a[N][N];
char s[N];
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int main(){
//	freopen("ex.in","r",stdin);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		scanf("%s",s+1);
		for(int j=1;j<=m;++j) mp[i][j]=(s[j]=='#');
	}
	for(int i=1;i<n;++i) for(int j=2;j<=m;++j) if((mp[i][j]^mp[i+1][j])==(mp[i][j-1]^mp[i+1][j-1])) a[i+1][j]=1;n++;
	for(int i=1;i<=n;++i) for(int j=1;j<=m;++j){
		if(a[i][j]==1) h[i][j]=h[i-1][j]+1,l[i][j]=l[i][j-1]+1;
		if(a[i][m-j+1]==1) r[i][m-j+1]=r[i][m-j+2]+1;
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			if(h[i][j]>1){
				l[i][j]=min(l[i][j],l[i-1][j]);
				r[i][j]=min(r[i][j],r[i-1][j]);
			}
			ans=max(ans,(l[i][j]+r[i][j])*(h[i][j]+1));
		}
	}
	printf("%d\n",max(ans,max(n-1,m)));
	return 0;
}