Cod sursa(job #498762)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 6 noiembrie 2010 00:39:09
Problema Oite Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#define mod 999887

struct point {long long inf; int i1,i2; point *leg;};

point *a[mod],*p;
int c,oi[1024],i,j,posib;
long long lanat,lanact;

inline void insereaza(long long sum,int ind1,int ind2)
{
	point *pct=a[sum%mod];
	
	pct=new point;
	pct->inf=sum; pct->i1=ind1; pct->i2=ind2; 
	pct->leg=a[sum%mod]; a[sum%mod]=pct;
}

inline void cauta(long long sum,int ind1,int ind2)
{
	point *pct=a[sum%mod];
	
	while (pct&&(pct->inf)>0)
	{
		if ((pct->inf)==sum&&(pct->i1)!=ind1&&(pct->i2)!=ind1&&(pct->i1)!=ind2&&(pct->i2)!=ind2) posib++;
		pct=pct->leg;
	}
	
}

int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	
	scanf("%d%lld",&c,&lanat);
	for (i=0;i<c;i++) scanf("%d",&oi[i]);
	
	for (i=0;i<c-1;i++)
		for (j=i+1;j<c;j++)
			if (oi[i]+oi[j]<lanat) insereaza(oi[i]+oi[j],i,j);
	
	posib=0;
	for (i=0;i<mod;i++)
		while (a[i])
		{
			if (lanat-a[i]->inf>0) cauta(lanat-a[i]->inf,(a[i]->i1),(a[i]->i2));
			a[i]=a[i]->leg;
		}
	
	printf("%d\n",posib/3);
	
	return 0;
}