Cod sursa(job #49217)

Utilizator amadaeusLucian Boca amadaeus Data 5 aprilie 2007 16:15:06
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
using namespace std;
#include<stdio.h>
#include<vector>

#define NMAX 1024
#define LMAX 8999

void read();
void solve();
void add( int val );
void rem( int val );
int find(int val);

struct ent {
	int x, y;
	ent( int a = 0, int b = 0 ) {
		x = a, y = b;
	}
};

int N, A[NMAX], L;
vector<ent> H[LMAX];
typedef vector< ent >::iterator it;
int x, y;

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( A[i] + A[j] );

     for(i = 1; i < N - 2; i++)
     {
     	for(j = i + 1; j < N; j++)
          rem( A[i] + A[j] );
          for(j = i - 1; j >= 0; j--)
          rez += find(L - A[i] - A[j]);
     }
     printf("%d\n", rez);
}

void add( int val )
{
	int q;
	it i;
     
     q = val % LMAX;
	
     for( i = H[q].begin(); i != H[q].end(); i++ )
     if( i->x == val)
     break;

     if( i == H[q].end() )
     	H[q].push_back( ent(val, 1) );
    	else
     	i->y ++;
}

void rem( int val )
{
	int q;
	it i;

     q = val % LMAX;

     for(i = H[q].begin(); i != H[q].end(); i++)
     if(i->x == val) break;
     
     i->y --;
}

int find(int val)
{
	int q;
 	it i;

     if(val < 0) return 0;
	q = val % LMAX;
     
     for(i = H[q].begin(); i != H[q].end(); i++)
     if(i->x == val)
     return i->y;
     return 0;
}