Cod sursa(job #497076)

Utilizator katakunaCazacu Alexandru katakuna Data 1 noiembrie 2010 16:37:00
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>
#include <algorithm>
#include <list>
#include <vector>
using namespace std;

#define Nmax 1030
#define MOD 666013

int n, L;
int v[Nmax];

list < pair <int, int> > H[MOD + 10];

void citire () {
	
	int i;
	
	scanf ("%d %d", &n, &L);
	for (i = 1; i <= n; i++) 
		scanf ("%d", &v[i]);
}

void insert (int val) {
	
	int p = val % MOD;
	for (list < pair <int, int> >::iterator it = H[p].begin (); it != H[p].end (); it++) 
		if (it->first == val) it->second++;

	H[p].push_back (make_pair(val, 1));
}

void erase (int val) {
	
	int p = val % MOD;
	for (list < pair <int, int> >::iterator it = H[p].begin (); it != H[p].end (); it++) {
		
		if (it->first == val) {
			it->second--;
			//if (it->second == 0) 
			  //  H[p].erase (it);
			return ;
		}
	}
}

int find (int val) {
	
	int p = val % MOD;
	for (list < pair <int, int> >::iterator it = H[p].begin (); it != H[p].end (); it++) {
		if (it->first == val) 
			return it->second;
	}
	
	return 0;
}

void rezolva () {
	
	int i, j, nr = 0;

	for (i = 2; i < n; i++)
		for (j = i + 1; j <= n; j++) 
			insert (v[i] + v[j]);
	
	for (i = 2; i < n; i++) {
		for (j = i + 1; j <= n; j++)
			erase (v[i] + v[j]);
		
		for (j = i - 1; j >= 1; j--) 
			if(L >= v[i] + v[j]) {
				nr+= find (L - v[i] - v[j]);
			}
	}
	
	printf ("%d", nr);
}

int main () {

	freopen ("oite.in", "r", stdin);
	freopen ("oite.out", "w", stdout);
	
	citire ();
	rezolva ();

	return 0;
}