Cod sursa(job #32338)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 17 martie 2007 18:44:16
Problema Oite Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 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);
}

void search(int st,int dr) {
int m;
	if (st>dr) return ;
	m=(st+dr)/2;
	if (sume[m][0]==val) {
	
		st=m; dr=m+1;
		for (;sume[st][0]==val;--st) 
			if (sume[st][1]>pst && sume[st][2]>pdr && sume[st][1]>pdr && sume[st][2]>pst) {
			       	//fprintf(stderr,"%i %i %i %i\n",sume[st][1],sume[st][2],pst,pdr);	
				++ret;
			}

		for (;sume[dr][0]==val;++dr) 
			if (sume[dr][1]>pst && sume[dr][2]>pdr && sume[dr][1]>pdr && sume[dr][2]>pst) {
			        //fprintf(stderr,"%i %i %i %i\n",sume[dr][1],sume[dr][2],pst,pdr);	
				++ret;
			}
				
	}
	else 
		if (val<sume[m][0]) 
			search(st,m-1);
		else 
			search(m+1,dr);
}

int main() {
int i,j;
	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) {
		//fprintf(stderr,"%i %i %i\n",sume[i][0],sume[i][1],sume[i][2]);
		val=L-sume[i][0];
		pst=sume[i][1];
		pdr=sume[i][2];
		search(1,dim);
	}
	
	printf("%i\n",ret);

	fclose(stdin); fclose(stdout);

	return 0;
}