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 Fortran (gfortran v4.8.4) (judge verdict: Accepted)

program triangles
  implicit none
  integer :: n, l(2000) = 0, m = 0, i, j, k
  integer(8) :: ans = 0_8
  read(*,*) n
  read(*,*) l(1:n)
  call quick_sort(l(1:n))
  do i = 1, n-2
    do j = i+1, n-1
      k = limit(l(1:n),j,l(i)+l(j))
      ans = ans+int(k-j,8)
    end do
  end do
  write(*,'(i0)') ans
contains
  function limit(a,i,v) result(l)
    integer, intent(in) :: a(:), v
    integer, intent(in) :: i
    integer :: l, r, m
    l = i
    r = size(a,1)+1
    do while (r-l > 1)
      m = (r+l)/2
      if (a(m) < v) then
        l = m
      else
        r = m
      end if
    end do
  end
  recursive subroutine quick_sort(a)
    integer, intent(inout) :: a(:)
    integer :: n, l, r, m
    integer :: p
    n = size(a)
    l = 1
    r = n
    m = (n+1)/2
    p = a(l)+a(m)+a(r)-max(a(l),a(m),a(r))-min(a(l),a(m),a(r))
    do
      do while (a(l) < p)
        l = l+1
      end do
      do while (a(r) > p)
        r = r-1
      end do
      if (l >= r) exit
      a(l) = xor(a(l),a(r))
      a(r) = xor(a(l),a(r))
      a(l) = xor(a(l),a(r))
      l = l+1
      r = r-1
    end do
    if (l-1 > 1) call quick_sort(a(1:l-1))
    if (n > r+1) call quick_sort(a(r+1:n))
  end
end program triangles