Pagini recente » Cod sursa (job #2212790) | Cod sursa (job #2862549) | Cod sursa (job #2803271) | Cod sursa (job #1317879) | Cod sursa (job #594129)
Cod sursa(job #594129)
#include <cstdio>
#include <utility>
#include <string>
using namespace std;
#define MAXN 1026
#define MOD 3033
#define LG 30
#define NOT -1
pair<int,short> H[MOD][LG];
inline int find(int x){
int key=x%MOD, i;
for(i=0; i<LG; ++i)
if(H[key][i].first == x)
return i;
return NOT;
}
inline void add(int x){
int key=x%MOD, i;
if((i=find(x)) == NOT){
for(i=0; i<LG; ++i)
if(!H[key][i].first)
H[key][i]=make_pair(x,1);
}
else
++H[key][i].second;
}
inline void erase(int x){
int key=x%MOD, i;
if((i=find(x)) != NOT)
--H[key][i].second;
}
inline int getcnt(int x){
int key=x%MOD, i;
for(i=0; i<LG; i++)
if(H[key][i].first == x)
return H[key][i].second;
return 0;
}
int main(){
freopen("oite.in", "r", stdin);
freopen("oite.out", "w", stdout);
int N, L, A[MAXN], i, j, res;
scanf("%d%d", &N, &L);
for(i=0; i<N; ++i)
scanf("%d", A+i);
memset(H, 0, sizeof(H));
for(i=2; i<N; ++i)
for(j=i+1; j<N; ++j)
if(A[i]+A[j] < L)
add(A[i]+A[j]);
res=0;
for(i=1; i<N-2; ++i){
for(j=0; j<i; ++j)
if(A[i]+A[j] < L)
res+=getcnt(L-A[i]-A[j]);
for(j=i+2; j<N; ++j)
if(A[i+1]+A[j] < L)
erase(A[i+1]+A[j]);
}
printf("%d\n", res);
return 0;
}