Problem:
Score : 400 points

Problem Statement

Takahashi has N sticks that are distinguishable from each other. The length of the i-th stick is L_i.

He is going to form a triangle using three of these sticks. Let a, b, and c be the lengths of the three sticks used. Here, all of the following conditions must be satisfied:

a < b + c

b < c + a

c < a + b

How many different triangles can be formed? Two triangles are considered different when there is a stick used in only one of them.

Constraints

All values in input are integers.

3 \leq N \leq 2 \times 10^3

1 \leq L_i \leq 10^3

Input

Input is given from Standard Input in the following format:

N
L_1 L_2 ... L_N

Constraints

Print the number of different triangles that can be formed.

Sample Input 1

4
3 4 2 1

Sample Output 1

1

Only one triangle can be formed: the triangle formed by the first, second, and third sticks.

Sample Input 2

3
1 1000 1

Sample Output 2

0

No triangles can be formed.

Sample Input 3

7
218 786 704 233 645 728 389

Sample Output 3

23

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <assert.h>
typedef int64_t ll;
typedef uint64_t ull;
int acs(const void *a, const void *b){return *(int*)a - *(int*)b;} /* 1,2,3,4.. */
int des(const void *a, const void *b){return *(int*)b - *(int*)a;} /* 8,7,6,5.. */
#define min(a,b) (a < b ? a: b)
#define max(a,b) (a > b ? a: b)

#define MAXN (200001)
#define MOD (1000000007)

// Segment Tree
// セグメント木
// 区間個数
// i = 0～
#define SEGT_N ((1<<17)) // > 10^5
#define SEGT_INVALID (INT_MIN)
int segt[SEGT_N*2];

void SEGTupdate(int i, int val)
{
    i = SEGT_N-1+i;
    segt[i]++;
    while(i)
    {
        i = (i-1)/2;
        segt[i] = segt[i*2+1]+segt[i*2+2];
    }
}

int SEGTget_sub(int l, int r, int i, int il, int ir)
{
    if((ir < l) || (r < il) ) return 0; // 被らない
    if((l <= il) && (ir<=r) )
    {
        return segt[i]; // 完全にかぶっている
    }else
    {
        int lv = SEGTget_sub(l,r,i*2+1,il, (il+ir+1)/2-1);
        int rv = SEGTget_sub(l,r,i*2+2, (il+ir+1)/2,ir);
        return lv+rv;
    }
}

int SEGTget(int l, int r)
{
    return SEGTget_sub(l,r,0,0,SEGT_N-1);
}

ll l[MAXN];

int main(void)
{
    ll n;
    scanf("%ld",&n);
    for(int i=0;i<n;i++)scanf("%ld",&l[i]);

    for(int i=0;i<n;i++) SEGTupdate(l[i],0);

    ll ans = 0;
    for(int i=0;i<n;i++) for(int j=i+1;j<n;j++)
    {
        ll n = SEGTget(abs(l[j]-l[i])+1,l[j]+l[i]-1);
        if(abs(l[j]-l[i])+1 <= l[i] && l[i] <= l[j]+l[i]-1 ) n--;
        if(abs(l[j]-l[i])+1 <= l[j] && l[j] <= l[j]+l[i]-1 ) n--;
        ans += n;
    }
    
    printf("%ld\n", ans/3);
    return 0;
}