Cod sursa(job #49202)

Utilizator amadaeusLucian Boca amadaeus Data 5 aprilie 2007 16:04:08
Problema Oite Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include<stdlib.h>

#define NMAX 1024
#define LMAX 30103

void add(int x);
void rem(int x);
int find(int x);

int v[ NMAX ];
int N, L;
int X[LMAX][100], Y[LMAX][100], res, nrv[LMAX];

void cit() {
	scanf( "%d%d", &N, &L );
	for(int  i = 0; i < N; i++ )
		scanf( "%d", v + i );
}

void rez() {
	int i, j;

	for(i = 0; i < LMAX; i++)
	X[i][0] = -1;
	
	for(i = 1; i < N; i++)
	for(j = i + 1; j < N; j++)
	add(v[i] + v[j]);

	for(i = 1; i < N - 2; i++)
	{
		for(j = i + 1; j < N; j++)
		rem(v[i] + v[j]);

		for(j = 0; j < i; j++)
		res += find(L - v[i] - v[j]);
	}
}

void scr() {
printf("%d\n", res);
}

int main() {
	freopen( "oite.in", "r", stdin );
	freopen( "oite.out", "w", stdout );

	cit();
	rez();
	scr();

	return 0;
}

void add(int x)
{
	int q, *p, *r;

	q = x % LMAX;
	for(p = X[q], r = Y[q]; *p != -1; p++, r++)
	if(*p == x)
	break;

	if(*p == -1)
	{
		if(p - X[q] >= 100) exit(5);
		
		*(p + 1) = -1;
		*p = x, *r = 1;
	}
	else (*r)++;
}

void rem(int x)
{
	int q, *p, *r;

	q = x % LMAX;
	for(p = X[q], r = Y[q]; *p != -1; p++, r++)
	if(*p == x) break;

	(*r)--;
}

int find(int x)
{
	int q, *p, *r;
	
	if(x < 0) return 0;
	q = x % LMAX;

	for(p = X[q], r = Y[q]; *p != -1; p++, r++)
	if(*p == x) return *r;
	
	return 0;
}