Cod sursa(job #31955)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 17 martie 2007 09:00:28
Problema Oite Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 1050;

int N, S, x[MAXN];
struct sum { int a, b, sum; } s[MAXN * MAXN];
int nr[MAXN];

int cmp(sum a, sum b) { return a.sum < b.sum; }

void update(int poz, int val)
{
	for (poz++; poz; poz -= (poz ^ (poz - 1)) & poz)
		nr[poz] += val;
}

int query(int poz)
{
	int rez = 0;
	for (poz++; poz < MAXN; poz += (poz ^ (poz - 1)) & poz)
		rez += nr[poz];
	return rez;
}

int main()
{
	freopen("oite.in", "rt", stdin);
	freopen("oite.out", "wt", stdout);
	scanf("%d %d", &N, &S);
	int i, j, M = -1; long long NR = 0;
	for (i = 0; i < N; i++)
		scanf("%d", x + i);
	sort(x, x + N);
	for (i = 0; i < N; i++)
		for (j = i + 1; j < N; j++)
		{
			s[++M].a = i;
			s[M].b = j;
			s[M].sum = x[i] + x[j];
		}
	sort(s, s + M + 1, cmp);
	j = M;
	for (i = 0; i <= M; i++)
	{
		if (i == 0 || s[i].sum != s[i - 1].sum)
		{
			if (j < 0) break;
			memset(nr, 0, sizeof(nr));
			for (; j >= 0 && s[i].sum + s[j].sum > S; j--);
			for (; j >= 0 && s[i].sum + s[j].sum == S; j--)
			{
				update(s[j].a, 1);
			}
		}
		NR += query( s[i].b + 1 );
	}
	printf("%lld\n", NR);
	return 0;
}