Cod sursa(job #49184)

Utilizator amadaeusLucian Boca amadaeus Data 5 aprilie 2007 15:23:50
Problema Oite Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
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;
}