Pagini recente » Cod sursa (job #2595640) | Cod sursa (job #97042) | Cod sursa (job #1549849) | Rating Nica Dan (RatkinHHK) | Cod sursa (job #594145)
Cod sursa(job #594145)
#include <cstdio>
#include <utility>
#include <string>
#include <vector>
using namespace std;
#define MAXN 1026
#define MOD 90011
#define LG 20
vector< pair<int,short> > H[MOD];
inline vector< pair<int,short> >::iterator find(int x){
int key=x%MOD;
vector< pair<int,short> >::iterator i;
for(i=H[key].begin(); i != H[key].end(); ++i)
if(i->first == x)
return i;
return H[key].end();
}
inline void add(int x){
int key=x%MOD;
vector< pair<int,short> >::iterator i;
if((i=find(x)) == H[key].end())
H[key].push_back(make_pair(x,1));
else
++i->second;
}
inline void erase(int x){
int key=x%MOD;
vector< pair<int,short> >::iterator i;
if((i=find(x)) != H[key].end())
--i->second;
}
inline int getcnt(int x){
int key=x%MOD;
vector< pair<int,short> >::iterator i;
for(i=H[key].begin(); i != H[key].end(); ++i)
if(i->first == x)
return 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;
}