Cod sursa(job #32346)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 17 martie 2007 19:01:59
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <stdio.h>
#define fin  "oite.in"
#define fout "oite.out"
#define Nmax 1025

int N,L,ret,dim,v[Nmax],sume[Nmax*Nmax][3];
int val,pst,pdr;

inline void swap(int &a,int &b) { int aux; aux=a; a=b; b=aux; }

void qsort(int st,int dr) {
int i,j,m;
	i=st; j=dr;
	m=sume[(i+j)/2][0];
	do {
		while (sume[i][0]<m) ++i;
		while (sume[j][0]>m) --j;
		if (i<=j) {
			swap(sume[j][0],sume[i][0]);
			swap(sume[j][1],sume[i][1]);
			swap(sume[j][2],sume[i][2]);
			++i; --j;
		}

	} while (i<j);

	if (i<dr) qsort(i,dr);
	if (j>st) qsort(st,j);
}

inline int search(int st,int dr) {
int m;
	if (st>dr) return 0;

	m=(st+dr)>>1;
	if (sume[m][0]==val) {
	
		if (sume[m-1][0]!=val) return m;

		else return search(st,m-1);
	}	
	else 
		if (val<sume[m][0]) 
			return search(st,m-1);
		else 
			return search(m+1,dr);
}

int main() {
int i,j,p=0;

	freopen(fin,"r",stdin); freopen(fout,"w",stdout);
	scanf("%i%i",&N,&L);

	for (i=1;i<=N;++i) 
		scanf("%i",&v[i]);

	for (i=1;i<=N;++i)
		for (j=i+1;j<=N;++j) {
			++dim;
			sume[dim][0]=v[i]+v[j];
			sume[dim][1]=i;
			sume[dim][2]=j;
		}
	
	qsort(1,dim);

	for (i=1;i<=dim;++i) {
		
		if (sume[i][0]!=sume[i-1][0]) {
			val=L-sume[i][0];
			p=search(1,dim);
		}
			
		pst=sume[i][1];
		pdr=sume[i][2];
		
		if (p!=0) {
			for (j=p;sume[j][0]==sume[p][0];++j) 
			if (sume[j][1]>pst && sume[j][2]>pdr && sume[j][1]>pdr && sume[j][2]>pst) 
			       ++ret;
		}
	}	
	
	printf("%i\n",ret);

	fclose(stdin); fclose(stdout);

	return 0;
}