#include<stdio.h>
#define N 800
int Partitie ( int*, int , int);
void Quicksort ( int*, int, int );
int BinSh ( int*, int );
int n;
int main()
{
int A[N], i, j, poz = -1, nr = 0, sum ;
freopen( "nrtri.in", "r", stdin );
freopen( "nrtri.out", "w", stdout );
scanf("%d", &n );
for ( i = 0 ; i < n ; i++ )
scanf ("%d", &A[i] );
Quicksort( A, 0, n-1 );
for ( i = 0 ; i < n ; i ++)
printf("%d ", A[i] );
printf("\n");
for ( i = 0 ; i < n-2 ; i++ )
for ( j = i+1 ; j < n-1 ; j++ )
{
sum = A[i] + A[j] + 1;
if ( sum > A[n-1] )
nr += ( poz - j );
else
{
poz = BinSh ( A, sum );
while ( poz == -1 && sum <= A[n-1] )
{
sum++;
poz = BinSh( A, sum );
}
if ( poz != -1 )
nr += ( poz - j - 1 );
}
printf ("%d %d %d %d\n", i, j, poz, nr );
}
printf ("%d", nr);
return 0;
}
int BinSh ( int *A, int x )
{
int low = 0, high = n, mid;
while ( low < high )
{
mid = low + ( high - low) / 2;
if ( A[mid] < x )
low = mid + 1;
else
high = mid;
}
if ( (low < n ) && ( A[low] == x ) )
return low;
else return -1;
}
void Quicksort ( int *A, int st, int dr )
{
int p;
if ( st < dr )
{
p = Partitie( A, st, dr );
Quicksort( A, st, p );
Quicksort ( A, p+1, dr );
}
}
int Partitie ( int *A, int st, int dr )
{
int pivot = A[st], i = st-1, j = dr + 1;
while( 1 )
{
do { i++; } while ( A[i] < pivot );
do { j--; } while ( A[j] > pivot );
if ( i < j )
{
int aux = A[i];
A[i] = A[j];
A[j] = aux;
}
else return j;
}
}