///*
//#include <stdio.h>
//#include<iostream>
//#include<string>
//#include<string.h>
//#include<stdlib.h>
//using namespace std;
//struct node
//{
//    int num;
//    double prc;
//    int x,y;
//} s[100105];
//int sl[105][105];
//int n,m;
//int maxe=-999999,mine=9999999;
//void dfs()
//{
//    if()
//}
//int main()
//{
//    int k=0;
//    cin>>n>>m;
//    for(int i=1; i<=n; i++)
//        for(int j=1; j<=m; j++)
//        {
//            cin>>s[k].num;
//            s[k].x=i;
//            s[k++].y=j;
//            sl[i][j] = s[k].num;
//        }
//    k = 0;
//    for(int i=1; i<=n; i++)
//        for(int j=1; j<=m; j++)
//            cin>>s[k++].prc;
//
//    sort(s,s+n*m);
//
//    dfsx(0,0);
//    printf("%d %d\n",mine,maxe);
//    return 0;
//}
//*/
//
//#include<stdio.h>
//#include <algorithm>
//#include <cstring>
//#include <iostream>
//#include<stack>
//using namespace std;
//int main()
//{
//    int num[15]={-1,0,2,3,4,6,8,11,15,17};
//    const int k =10;
//    int top = 0;
//    int back = 9;
//    while(top<back)
//    {
//        if(num[top]+num[back]==10)
//        {
//            printf("%d %d\n",num[top],num[back]);
//            if(num[back]==num[back-1])
//                back--;
//            else if(num[top]==num[top+1])
//                top++;
//        }
//        else if(num[top]+num[back]<10)
//        {
//            top++;
//        }
//        else if(num[top]+num[back]>10)
//        {
//            back--;
//        }
//    }
//
//    return 0;
//}
//

//
//#include<iostream>
//using namespace std;
//int a[105][10000];
//int b[100000];
//void catalan() //求卡特兰数
//{
//    int i, j, len, carry, temp;
//    a[1][0] = b[1] = 1;
//    len = 1;
//    for(i = 2; i <= 100; i++)
//    {
//        for(j = 0; j < len; j++) //乘法
//            a[i][j] = a[i-1][j]*(4*(i-1)+2);
//        carry = 0;
//        for(j = 0; j < len; j++) //处理相乘结果
//        {
//            temp = a[i][j] + carry;
//            a[i][j] = temp % 10;
//            carry = temp / 10;
//        }
//        while(carry) //进位处理
//        {
//            a[i][len++] = carry % 10;
//            carry /= 10;
//        }
//        carry = 0;
//        for(j = len-1; j >= 0; j--) //除法
//        {
//            temp = carry*10 + a[i][j];
//            a[i][j] = temp/(i+1);
//            carry = temp%(i+1);
//        }
//        while(!a[i][len-1]) //高位零处理
//            len --;
//        b[i] = len;
//    }
//}
//int main()
//{
//    int n;
//    catalan();
//    while(cin>>n)
//    {
//        for(int i=0; i<b[n]; i++)
//            cout<<a[n][i];
//        cout<<endl;
//    }
//    return 0;
//}

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int num[10005];
    for(int i=0; i<n; i++)
        cin>>num[i];
    sort(num,num+n);
    int ans = 0 ;
    for(int i=0; i<n-2; i++)
    {
        for(int j=i+1; j<n-1; j++)
        {
            for(int k=j+1;k<n;k++)
            {
                if(num[i]+num[j]>num[k])
                    ans ++;
                else break;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}




Measured memory_bytes: 256