def d_triangles():

    from itertools import combinations

    from bisect import bisect_right

    N = int(eval(input()))

    L = sorted([int(i) for i in input().split()])



    ans = 0

    for max_index in range(2, N):

        c = L[max_index]

        for second_index in range(max_index):

            b = L[second_index]

            other_index = bisect_right(L, c - b)

            if max_index > other_index:

                ans += max_index - other_index

                if other_index <= second_index:

                    ans -= 1

    return ans // 2



print((d_triangles()))
def d_triangles():

    from bisect import bisect_right

    N = int(eval(input()))

    L = sorted([int(i) for i in input().split()])



    ans = 0

    for max_index in range(2, N):

        for second_index in range(1, max_index):

            b, c = L[second_index], L[max_index]

            # b <= c となるように辺を選ぶ (ソートしておけば簡単)。

            # 残りの辺の長さを a として、三角不等式は c < a + b ⇔ a > c - b である。

            # よって二分探索で長さが c - b より大きく b より小さな辺を求めればよい。

            third_index = bisect_right(L, c - b)

            if third_index < second_index:

                ans += second_index - third_index

    return ans



print((d_triangles()))
def d_triangles():
    from itertools import combinations
    from bisect import bisect_right

    N = int(eval(input()))
    L = sorted([int(i) for i in input().split()])
    ans = 0
    for max_index in range(2, N):
        c = L[max_index]
        for second_index in range(max_index):
            b = L[second_index]
            other_index = bisect_right(L, c - b)
            if max_index > other_index:
                ans += max_index - other_index
                if other_index <= second_index:
                    ans -= 1
    return ans // 2


print((d_triangles()))

def d_triangles():
    from bisect import bisect_right

    N = int(eval(input()))
    L = sorted([int(i) for i in input().split()])
    ans = 0
    for max_index in range(2, N):
        for second_index in range(1, max_index):
            b, c = L[second_index], L[max_index]
            # b <= c となるように辺を選ぶ (ソートしておけば簡単)。
            # 残りの辺の長さを a として、三角不等式は c < a + b ⇔ a > c - b である。
            # よって二分探索で長さが c - b より大きく b より小さな辺を求めればよい。
            third_index = bisect_right(L, c - b)
            if third_index < second_index:
                ans += second_index - third_index
    return ans


print((d_triangles()))

-    from itertools import combinations -        c = L[max_index] -        for second_index in range(max_index): -            b = L[second_index] -            other_index = bisect_right(L, c - b) -            if max_index > other_index: -                ans += max_index - other_index -                if other_index <= second_index: -                    ans -= 1 -    return ans // 2 +        for second_index in range(1, max_index): +            b, c = L[second_index], L[max_index] +            # b <= c となるように辺を選ぶ (ソートしておけば簡単)。 +            # 残りの辺の長さを a として、三角不等式は c < a + b ⇔ a > c - b である。 +            # よって二分探索で長さが c - b より大きく b より小さな辺を求めればよい。 +            third_index = bisect_right(L, c - b) +            if third_index < second_index: +                ans += second_index - third_index +    return ans