import bisect

# 三角形の条件: c < a+b 



N = int(eval(input()))

L = list(map(int, input().split()))

L.sort()



ans = 0

# a と b を固定

for a in range(N):

  for b in range((a+1), N):

    # c の動ける範囲の右端を求める

    c = L[a]+L[b]

    k = bisect.bisect_left(L, c)

    # c の動ける範囲は、[j+1, k)

    ans += k - b - 1

print(ans)    
import bisect

# 三角形の条件: c < a+b 



N = int(eval(input()))

L = list(map(int, input().split()))

L.sort()



ans = 0

for i in range(N-1, 1, -1):

  a = 0

  b = i-1

  while a<b:

    if L[a]+L[b] > L[i]:

      ans += b-a

      b -= 1

    else:

      a += 1

          

print(ans)    
import bisect

# 三角形の条件: c < a+b
N = int(eval(input()))
L = list(map(int, input().split()))
L.sort()
ans = 0
# a と b を固定
for a in range(N):
    for b in range((a + 1), N):
        # c の動ける範囲の右端を求める
        c = L[a] + L[b]
        k = bisect.bisect_left(L, c)
        # c の動ける範囲は、[j+1, k)
        ans += k - b - 1
print(ans)

import bisect

# 三角形の条件: c < a+b
N = int(eval(input()))
L = list(map(int, input().split()))
L.sort()
ans = 0
for i in range(N - 1, 1, -1):
    a = 0
    b = i - 1
    while a < b:
        if L[a] + L[b] > L[i]:
            ans += b - a
            b -= 1
        else:
            a += 1
print(ans)

-# a と b を固定 -for a in range(N): -    for b in range((a + 1), N): -        # c の動ける範囲の右端を求める -        c = L[a] + L[b] -        k = bisect.bisect_left(L, c) -        # c の動ける範囲は、[j+1, k) -        ans += k - b - 1 +for i in range(N - 1, 1, -1): +    a = 0 +    b = i - 1 +    while a < b: +        if L[a] + L[b] > L[i]: +            ans += b - a +            b -= 1 +        else: +            a += 1