Cod sursa(job #497528)

Utilizator Addy.Adrian Draghici Addy. Data 2 noiembrie 2010 18:55:27
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MOD = 666013;
const int NMAX = 1048;

int V[NMAX], A[MOD], n, x, i, j, k, a, b, c, nr;
vector < pair <int, int> > H[MOD + 10];

int cauta (int);
void adauga (int), sterge (int);

int main () {
	
	freopen ("oite.in", "r", stdin);
	freopen ("oite.out", "w", stdout);
	
	scanf ("%d %d", &n, &x);
	
	for (i = 1; i <= n; ++i)
		scanf ("%d", &V[i]);
	
	for (i = 3; i < n; ++i)
		for (j = i + 1; j <= n; ++j) {
			a = V[i] + V[j];
			adauga (a);
		}
	
	for (k = 2; k < n - 1; ++k) {
		for (i = 1; i < k; ++i) {
			a = V[i] + V[k];
			if (x >= a)
				nr += cauta (x - a);
		}
		
		for (i = k + 2; i <= n; ++i) {
			a = V[k+1] + V[i];
			sterge (a);
		}
	}
	
	printf ("%d", nr);
	
	return 0;
}

void adauga (int v) {
	
	int p = v % MOD;
	vector < pair <int, int> >::iterator it;
	
	for (it = H[p].begin (); it != H[p].end (); ++it)
		if (it -> first == v) {
			it -> second++;
			return;
		}
	
	H[p].push_back (make_pair (v, 1));
}

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

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