Cod sursa(job #498752)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 5 noiembrie 2010 23:51:22
Problema Oite Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>

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

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

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

inline bool cauta(long long sum,int ind1,int ind2)
{
	point *act=a[sum%1000000],*pct=act;
	
	while (pct&&(pct->inf)>0)
	{
		if (pct->inf==sum) return true;
		pct=pct->leg;
	}
	
	return false;
}

int main()
{
	freopen("oite.in","r",stdin);
	freopen("oite.out","w",stdout);
	
	scanf("%d%ldd",&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++)
			insereaza(oi[i]+oi[j],i,j);
	
	posib=0;
	
	for (i=0;i<1000000;i++)
	{
		p=a[i];
		while (p&&(p->inf)>0)
		{
			lanact=p->inf;
			if (lanat-lanact>0) posib+=(int)(cauta(lanat-lanact,p->i1,p->i2));
			p=p->leg;
		}
	}
	
	printf("%d\n",posib/3);
	
	return 0;
}