import sys


def input(): return sys.stdin.readline().strip()
def I(): return int(input())
def LI(): return list(map(int, input().split()))


# 条件を満たすかどうか
def is_ok(l, i, key):
    # ここが条件
    if l[i] >= key:
        return True


def binary_seach(l, key) -> int:
    left = -1
    right = len(l)

    while right - left > 1:
        mid = left + (right - left) // 2
        if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

    return right


n = I()
l = LI()
l = sorted(l)
ans = 0
for i in range(n - 2):
    # 三角形のうち一番短い辺
    a = l[i]
    for j in range(i + 1, n - 1):
        # 三角形のうち二番目に短い辺
        b = l[j]
        # 三角形の中で一番大きい辺 かつ
        # a + b より小さい辺 を二分探索で探す
        # a + b 以上の要素の初めのindexを取得
        ind = binary_seach(l, a + b)
        # b 以上の辺のうち、a + b より小さい要素の数を足す
        ans += ind - j - 1
print(ans) import sys sys def input(): return sys.stdin.readline().strip() input def I(): return int(input()) I def LI(): return list(map(int, input().split()))


# 条件を満たすかどうか LI def is_ok(l, i, key):
    # ここが条件
    if l[i] >= key:
        return True is_ok if l[i] >= key:
        return True l[i] >= key l[i] l i key return True True l l i i key key def binary_seach(l, key) -> int:
    left = -1
    right = len(l)

    while right - left > 1:
        mid = left + (right - left) // 2
        if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

    return right binary_seach left = -1 left -1 right = len(l) right len(l) len l while right - left > 1:
        mid = left + (right - left) // 2
        if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

     right - left > 1 right - left right left 1 mid = left + (right - left) // 2 mid left + (right - left) // 2 left (right - left) // 2 right - left right left 2 if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

     is_ok(l, mid, key) is_ok l mid key right = mid right mid left = mid left mid return right right l l key key n = I() n I() I l = LI() l LI() LI l = sorted(l) l sorted(l) sorted l ans = 0 ans 0 for i in range(n - 2):
    # 三角形のうち一番短い辺
    a = l[i]
    for j in range(i + 1, n - 1):
        # 三角形のうち二番目に短い辺
        b = l[j]
        # 三角形の中で一番大きい辺 かつ
        # a + b より小さい辺 を二分探索で探す
        # a + b 以上の要素の初めのindexを取得
        ind = binary_seach(l, a + b)
        # b 以上の辺のうち、a + b より小さい要素の数を足す
        ans += ind - j - 1 i range(n - 2) range n - 2 n 2 a = l[i] a l[i] l i for j in range(i + 1, n - 1):
        # 三角形のうち二番目に短い辺
        b = l[j]
        # 三角形の中で一番大きい辺 かつ
        # a + b より小さい辺 を二分探索で探す
        # a + b 以上の要素の初めのindexを取得
        ind = binary_seach(l, a + b)
        # b 以上の辺のうち、a + b より小さい要素の数を足す
        ans += ind - j - 1 j range(i + 1, n - 1) range i + 1 i 1 n - 1 n 1 b = l[j] b l[j] l j ind = binary_seach(l, a + b) ind binary_seach(l, a + b) binary_seach l a + b a b ans += ind - j - 1 ans ind - j - 1 ind - j ind j 1 print(ans) print ans def LI(): return list(map(int, input().split()))


# 条件を満たすかどうか def LI(): return list(map(int, input().split()))


# 条件を満たすかどうか LI a = l[i] l[i] a def I(): return int(input()) def I(): return int(input()) I ans += ind - j - 1 ind - j - 1 ans ans = 0 0 ans ind = binary_seach(l, a + b) binary_seach(l, a + b) ind l = LI() LI() l def input(): return sys.stdin.readline().strip() def input(): return sys.stdin.readline().strip() input def is_ok(l, i, key):
    # ここが条件
    if l[i] >= key:
        return True def is_ok(l, i, key):
    # ここが条件
    if l[i] >= key:
        return True is_ok n = I() I() n def binary_seach(l, key) -> int:
    left = -1
    right = len(l)

    while right - left > 1:
        mid = left + (right - left) // 2
        if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

    return right def binary_seach(l, key) -> int:
    left = -1
    right = len(l)

    while right - left > 1:
        mid = left + (right - left) // 2
        if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

    return right binary_seach l = sorted(l) sorted(l) l b = l[j] l[j] b
import sys


def input(): return sys.stdin.readline().strip()
def I(): return int(input())
def LI(): return list(map(int, input().split()))


# 条件を満たすかどうか
def is_ok(l, i, key):
    # ここが条件
    if l[i] >= key:
        return True


def binary_seach(l, key) -> int:
    left = -1
    right = len(l)

    while right - left > 1:
        mid = left + (right - left) // 2
        if is_ok(l, mid, key):
            right = mid
        else:
            left = mid

    return right


n = I()
l = LI()
l = sorted(l)
ans = 0
for i in range(n - 2):
    # 三角形のうち一番短い辺
    a = l[i]
    for j in range(i + 1, n - 1):
        # 三角形のうち二番目に短い辺
        b = l[j]
        # 三角形の中で一番大きい辺 かつ
        # a + b より小さい辺 を二分探索で探す
        # a + b 以上の要素の初めのindexを取得
        ind = binary_seach(l, a + b)
        # b 以上の辺のうち、a + b より小さい要素の数を足す
        ans += ind - j - 1
print(ans)
