Pagini recente » Cod sursa (job #753599) | Cod sursa (job #279067) | Cod sursa (job #1455739) | Cod sursa (job #1661199) | Cod sursa (job #32346)
Cod sursa(job #32346)
#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;
}