Cod sursa(job #1199527)

Utilizator hrazvanHarsan Razvan hrazvan Data 19 iunie 2014 16:41:30
Problema Oite Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#define MAXC 1024
#define MOD 355099
int v[ MAXC + 1 ];
int hash[ MAXC * MAXC + 1 ], unu[ MAXC * MAXC + 1 ], doi[ MAXC * MAXC + 1 ], ult[ MOD ], dr = 1;

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 );
    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;
}