Pagini recente » Cod sursa (job #2252179) | Cod sursa (job #3227800) | Cod sursa (job #1493501) | Cod sursa (job #2706832) | Cod sursa (job #49184)
Cod sursa(job #49184)
using namespace std;
#include<stdio.h>
#include<vector>
#define NMAX 1024
#define LMAX 1000367
void read();
void solve();
void add(int x, int y);
void rem(int x, int y);
int find(int val);
int N, A[NMAX], L;
vector<int> X[LMAX], Y[LMAX];
typedef vector< int >::iterator it;
int main()
{
freopen("oite.in", "r", stdin);
freopen("oite.out", "w", stdout);
read();
solve();
return 0;
}
void read()
{
scanf("%d%d", &N, &L);
for(int i = 0; i < N; i++)
scanf("%d", A + i);
}
void solve()
{
int i, j, rez = 0;
for(i = N - 1; i >= 2; i--)
for(j = i - 1; j >= 1; j--)
add(i, j);
for(i = 1; i < N - 2; i++)
{
for(j = i + 1; j < N; j++)
rem(i, j);
for(j = i - 1; j >= 0; j--)
rez += find(L - A[i] - A[j]);
}
printf("%d\n", rez);
}
void add(int x, int y)
{
int q, val;
it i, j;
val = A[x] + A[y];
q = val % LMAX;
for( i = X[q].begin(), j = Y[q].begin(); i != X[q].end(); i++, j++)
if(*i == val)
break;
if( i == X[q].end() )
{
X[q].push_back(val);
Y[q].push_back(1);
}
else
(*j)++;
}
void rem(int x, int y)
{
int q, val;
it i, j;
val = A[x] + A[y];
q = val % LMAX;
for(i = X[q].begin(), j = Y[q].begin(); i != X[q].end(); i++, j++)
if(*i == val) break;
(*j)--;
}
int find(int val)
{
int q;
it i, j;
if(val < 0) return 0;
q = val % LMAX;
for(i = X[q].begin(), j = Y[q].begin(); i != X[q].end(); i++, j++)
if(*i == val)
return *j;
return 0;
}