module Main where
import qualified Control.Monad as C
import qualified Data.Char as C
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Array as A
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM


int = read :: String -> Int

main = interact $ printer . solver . parser
parser = map int . tail . words
printer = (++"\n") . show

solver ss = answer
  where
    vec = V.fromList $ flip zip [0..] $ L.sort ss
    n = length vec
    list = do
      i <- [0..(n-3)]
      j <- [(i+1)..(n-2)]
      let u = ubound vec ((fst$vec V.!i)+(fst$vec V.!j)-1, 3000) 
      let l = lbound vec $ max ((fst$vec V.!j)-(fst$vec V.!i)+1, 0) (vec V.!(j+1))
      -- [(i,j,if l > u then 0 else u - l + 1)]
      [if u - l > 0 then u - l else 0 ]
    answer = sum list



lbound :: (Ord a) => V.Vector a -> a -> Int 
lbound v key = bound' v 0 (length v) (<=) key 

ubound :: (Ord a) => V.Vector a -> a -> Int 
ubound v key = bound' v 0 (length v) (<) key 

bound' :: (Ord a) => V.Vector a -> Int -> Int -> (a->a->Bool) -> a -> Int
bound' v f t op key 
  | f == t = f 
  | op key b = bound' v f m op key 
  | otherwise = bound' v (m+1) t op key 
  where
    m = (f + t) `div` 2
    b = v V.! m 

