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.Text;
using System.Collections.Generic;
using System.Linq;
using E = System.Linq.Enumerable;
 
class Program
 {
  
        static int[] a;
        static int N;
        static int K;
        static long[,] answer;
        
        static void Main(string[] args)
        {
          //入力を受け取る
          var NK = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
          N = NK[0];
          K = NK[1];
          a = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
          answer = new long[N,N];
          for(int i = 0; i < N ; i++){
            for(int j = 0; j < N ; j++){
              if(i == j){
                if(a[i] >= K){
                  answer[i,j] = 1;
                }else{
                  answer[i,j] = 0;
                }
              }else{
                answer[i,j] = -1;
              }
            }
          }
         
          Console.WriteLine(CheckArray(0,N-1));
        }
  
  static long CheckArray(long head,long tail){

      long length = tail - head;
      long result = 0;
      //headの数字を使う場合
      for(int i = 0; i <= tail ; i++){
        if(IsOverK(i,tail)){
          result++;
        }
      }
      //headの数字を使わない場合
      if(tail-1 >= 0){
       result += CheckArray(head,tail-1);
      }

      answer[head,tail] = result;
      //Console.WriteLine("head:"+head+" tail:"+tail+" result:"+result);
      return result;

  }
  
  static bool IsOverK(long head,long tail){
      long sum = 0;
      for(long i = head; i <= tail ; i++){
        sum += a[i];
      }
      if(sum >= K){
        return true;
      }
    return false;
  }
  
 }