Cod sursa(job #694588)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 27 februarie 2012 22:00:20
Problema Oite Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define Nmax 2000
#define pb push_back
#define mp make_pair
#define s first
#define x1 second.first
#define x2 second.second

using namespace std;

int j,n,S,i,sol,a[Nmax];
vector<pair<int,pair<int,int> > > H[199199];
vector<pair<int,pair<int,int> > >::iterator it;

void insert(int x)
{
	H[x%199193].pb(mp(x,mp(i,j)));
}

int OK(pair<int,pair<int,int> > X,int i,int j,int x)
{
	if (X.s!=x) return 0;
	if (X.x1==i) return 0;
	if (X.x2==i) return 0;
	if (X.x1==j) return 0;
	if (X.x2==j) return 0;
	return 1;
}

void search(int x)
{
	for (it=H[x%199193].begin();it!=H[x%199193].end();it++)
		if (OK(*it,i,j,x)) 
			sol++;
}

int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	
	scanf("%d%d",&n,&S);
	
	for (i=1;i<=n;++i)
		scanf("%d",&a[i]);
	
	for (i=1;i<=n;++i)
		for (j=i+1;j<=n;++j)
			if (a[i]+a[j]<S) insert(a[i]+a[j]);
	for (i=1;i<=n;++i)
		for (j=i+1;j<=n;++j)
			if (S-a[i]-a[j]>0) search(S-a[i]-a[j]);
	printf("%d\n",sol/6);
}