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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

// Bismillahirrahmanirrahim
#include<bits/stdc++.h>
using namespace std;
vector<int> vec;
int n;
int bins(int bas, int son) { // son dan küçük en büyük index ve bas tan büyük en küçük index.
	    int l = 0;
	    int r = n - 1;
	    int leftGreater = n;
	    while (l <= r) {
	        int m = l + (r - l) / 2;
	        if (vec[m] > bas) {
	            leftGreater = m;
	            r = m - 1;
	        }

	        else
	            l = m + 1;
	    }

	 int left = 0;
	 int right = n - 1;

	 while (left <= right) {
			 int mid = (right + left) / 2;

			 // Check if middle element is
			 // less than or equal to key
			 if (vec[mid] < son) {

					 left = mid + 1;
			 }
			 else
					 right = mid - 1;
	 }
	 	//cout <<right <<" " << leftGreater << endl;
	    return right - leftGreater + 1;
	}




int main() {
		 cin >> n;
		for(int i = 0; i < n; i++) {
			int x; cin >> x; vec.push_back(x);
		}
		sort(vec.begin(), vec.end());
		//cout << bins(2,4) << endl;
		int son_res = 0;
		for(int i = 0; i < n; i++) {
			int res;
			for(int j = i+1; j < n; j++){
				int bas = vec[j] - vec[i];
				int son = vec[j] + vec[i]; // All numbers that satisify bas < vec[k] < son.
				res = bins(bas, son);
				//cout << res << " " << vec[i] << " " << vec[j] <<endl;
				if(bas < vec[i] && vec[i] < son) {res--;}
				if(bas < vec[j] && vec[j] < son) res--;
				//cout << res << endl;cout << "-----------" <<endl;
				son_res += res;
			}
		}
		cout << son_res/3 << endl;
}