Problem:
Score : 400 points

Problem Statement

Takahashi has N sticks that are distinguishable from each other. The length of the i-th stick is L_i.

He is going to form a triangle using three of these sticks. Let a, b, and c be the lengths of the three sticks used. Here, all of the following conditions must be satisfied:

a < b + c

b < c + a

c < a + b

How many different triangles can be formed? Two triangles are considered different when there is a stick used in only one of them.

Constraints

All values in input are integers.

3 \leq N \leq 2 \times 10^3

1 \leq L_i \leq 10^3

Input

Input is given from Standard Input in the following format:

N
L_1 L_2 ... L_N

Constraints

Print the number of different triangles that can be formed.

Sample Input 1

4
3 4 2 1

Sample Output 1

1

Only one triangle can be formed: the triangle formed by the first, second, and third sticks.

Sample Input 2

3
1 1000 1

Sample Output 2

0

No triangles can be formed.

Sample Input 3

7
218 786 704 233 645 728 389

Sample Output 3

23

Solution in C# (Mono 4.6.2.0) (judge verdict: Runtime Error)

using System;
using System.Collections.Generic;

namespace AtCorder
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var lengthStr = Console.ReadLine().Split(' ');
            var lengthes = new int[lengthStr.Length];
            var result = 0;
            int?[,,] dp = new int?[lengthes.Length, lengthes.Length, lengthes.Length];

            //1: 数値 2: 配列の番号
            var triangles = new List<int[,]>();
            var resultTriangles = new List<int[,]>();

            for (var i = 0; i < lengthStr.Length; i++)
            {
                lengthes[i] = int.Parse(lengthStr[i]);
            }

            for (int i = 0; i < lengthes.Length; i++)
            {
                for (int j = i + 1; j < lengthes.Length; j++)
                {
                    int[,] lengthHozon = new int[3,2];
                    lengthHozon[0, 0] = lengthes[i];
                    lengthHozon[0, 1] = i;

                    lengthHozon[1, 0] = lengthes[j];
                    lengthHozon[1, 1] = j;

                    // 値が入っていないことを示す。
                    lengthHozon[2, 0] = -1;
                    lengthHozon[2, 1] = -1;

                    triangles.Add(lengthHozon);
                }
            }

            foreach (var t in triangles)
            {
                for (int i = 0; i < lengthes.Length; i++)
                {
                    if (t[0,1] != i && t[1,1] != i
                        && t[0,0] + t[1,0] > lengthes[i]
                        && t[0, 0] + lengthes[i] > t[1, 0]
                        && lengthes[i] + t[1, 0] > t[0, 0])
                    {
                        var array = new int[] { t[0, 1], t[1, 1], i };
                        Array.Sort(array);
                        var isSame = false;

                        if (dp[array[0], array[1], array[2]] != null)
                        {
                            isSame = true;
                        }

                        if(!isSame)
                        {
                            dp[array[0], array[1], array[2]] = 1;
                            result ++;
                        }
                    }
                }
            }

            Console.WriteLine(result);
        }
    }
}