Cod sursa(job #51098)
// N^3 * log N
#include <stdio.h>
#include <fstream>
#include <algorithm>
using namespace std;
#define in "oite.in"
#define out "oite.out"
#define dim 1025
int C[dim];
int N, L, S;
int t = 0;
bool Search(int st, int dr, int val);
void Qsort(int,int);
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d%d", &N, &L);
for ( int i = 1; i <= N; i++ )
scanf("%d", &C[i]);
Qsort(1,N);
//sort(C+1,C+N+1);
/*for ( int i = 1; i <= N; i++ )
printf("%d ", C[i]);*/
t = 0;
for ( int i = 1; i < N-2; i++ )
for ( int j = i+1; j < N-1; j++ )
for ( int k = j+1; k < N; k++ )
{
S = L - C[i] - C[j] - C[k];
if ( ( S < 0 ) || ( S < C[k] ) || ( S == C[k] && C[k+1] != S ) ) continue;
else
{
if ( Search(k+1,N,S) == 1 )
{
// printf("%d %d %d\n", i, j, k);
t += 1;
}
}
}
printf("%d", t);
}
void Qsort(int st, int dr)
{
int i = st - 1;
int j = dr + 1;
int pivot = C[st];
while ( i <= j )
{
do { i++; } while ( C[i] < pivot );
do { j--; } while ( C[j] > pivot );
if ( i <= j )
{
int aux = C[i];
C[i] = C[j];
C[j] = aux;
}
}
if ( st < j ) Qsort(st,j);
if ( i < dr ) Qsort(i,dr);
}
bool Search(int st, int dr, int val)
{
int mij = 0;
bool ok = 0;
while ( st <= dr )
{
int mij = (st+dr)>>1;
if ( C[mij] == val ) ok = 1, st = dr + 1;
else if ( C[mij] > val ) dr = mij - 1;
else if ( C[mij] < val ) st = mij + 1;
}
return ok;
}