Pagini recente » Cod sursa (job #2837074) | Cod sursa (job #2203285) | Cod sursa (job #1180480) | Cod sursa (job #3219921) | Cod sursa (job #1199538)
#include <stdio.h>
#define MAXC 1024
#define MOD 666013
int v[ MAXC + 1 ];
int hash[ MAXC * MAXC + 1 ], unu[ MAXC * MAXC + 1 ], doi[ MAXC * MAXC + 1 ], ult[ MOD ], dr = 1;
void mysort( int st, int dr ){
int i = st, j = dr, aux, piv = v[ ( st + dr ) / 2 ];
while ( i <= j ){
while ( v[ i ] < piv ) i++;
while ( v[ j ] > piv ) j--;
if ( i <= j ){
aux = v[ i ]; v[ i ] = v[ j ]; v[ j ] = aux;
i++; j--;
}
}
if ( i < dr ) mysort( i, dr );
if ( st < j ) mysort( st, j );
return ;
}
void add( int a, int b ){
int x = ( v[ a ] + v[ b ] ) % MOD;
hash[ dr ] = ult[ x ];
ult[ x ] = dr;
unu[ dr ] = a;
doi[ dr ] = b;
dr++;
return ;
}
long long exista( int l, int a, int b ){
int poz = ult[ l - ( ( v[ a ] + v[ b ] ) % MOD ) ];
long long rez = 0;
while ( poz > 0 ){
if ( unu[ poz ] < a && doi[ poz ] < b && a < doi[ poz ] ) rez++;
poz = hash[ poz ];
}
return rez;
}
int main()
{
FILE *in = fopen ( "oite.in", "r" );
int c, l;
fscanf ( in, "%d%d", &c, &l );
int i, j;
for ( i = 1; i <= c; i++ ){
fscanf ( in, "%d", &v[ i ] );
}
fclose ( in );
mysort( 1, c );
long long rez = 0;
for ( i = 1; i <= c; i++ ){
for ( j = i + 1; j <= c; j++ ){
if ( v[ i ] + v[ j ] <= l ){
rez += exista ( l, i, j );
}
add( i, j );
}
}
FILE *out = fopen ( "oite.out", "w" );
fprintf ( out, "%lld", rez );
fclose ( out );
return 0;
}