Cod sursa(job #731140)

Utilizator geniucosOncescu Costin geniucos Data 7 aprilie 2012 15:54:58
Problema Oite Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
int i,j,s,p,u,m,n,l,s1,nr1,a[1026];
int b[1000002],ap[1000002];
int main()
{
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
scanf("%d",&n);
scanf("%d",&l);
for(i=1;i<=n;i++)
{
	scanf("%d",&a[i]);
	if(a[i]<=1000000) ap[a[i]]++;
}
sort(a+1,a+n+1);
for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)
		if(a[i]+a[j]<=1000000) b[a[i]+a[j]]++;
for(i=1;i<=n;i++)
	for(j=i+1;j<=n;j++)
	if(a[i]+a[j]<=l)
	{
		nr1=b[l-a[i]-a[j]];
		s1=l-a[i]-a[j]-a[i];
		p=1;
		u=n;
		while(p<=u)
		{
			m=(p+u)/2;
			if(a[m]>s1) u=m-1;
			else
			if(a[m]<s1) p=m+1;
			else break;
		}
		if(p<=u) nr1=nr1-ap[s1];
		s1=l-a[i]-a[j]-a[j];
		p=1;
		u=n;
		while(p<=u)
		{
			m=(p+u)/2;
			if(a[m]>s1) u=m-1;
			else
			if(a[m]<s1) p=m+1;
			else break;
		}
		if(p<=u) nr1=nr1-ap[s1];
		if(nr1>0)
			s=s+nr1;
	}
printf("%d\n",s/6);
return 0;
}