Cod sursa(job #2008337)

Utilizator otto1Palaga Vicentiu-Octavian otto1 Data 6 august 2017 11:51:51
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define MAXN 1024
#define MOD 10007
#define pb push_back

typedef long long llong;

int N, C, L, A[MAXN];
vector<int> H[MOD], Nr[MOD];

llong res;

void insert(int val)
{
    int i, key = val%MOD;

    for(i = (int)(H[key].size())-1; i >= 0; i--)
     if(H[key][i] == val)
     {
        Nr[key][i]++;
        return ;
     }

    H[key].pb(val), Nr[key].pb(1);
}

int query(int val)
{
    int i, key = val%MOD;

    for(i = (int)(H[key].size())-1; i >= 0; i--)
     if( H[key][i] == val )
        return Nr[key][i];

    return 0;
}

void solve(void)
{
    int i, j, k;

    for(i = N-1; i >= 0; i--)
    {
        for(j = i-1; j >= 0; j--)
         if( (k = L-A[i]-A[j]) >= 0 )
            res += (llong)query(k);
        for(j = i+1; j < N; j++)
         if( (k = A[i]+A[j]) <= L )
            insert(k);
    }
}

void read_data(void)
{
    int i, j;

    scanf("%d %d\n", &C, &L), N = C;

    for(i = 0; i < C; i++)
        scanf("%d ", &A[i]);
}

void write_data(void)
{
    printf("%lld\n", res);
}

int main(void)
{
    freopen("oite.in", "rt", stdin);
    freopen("oite.out", "wt", stdout);

//    int start, end;

//    start = clock();

    read_data();
    solve();
    write_data();

//    end = clock();

//    fprintf(stderr, "%lf\n", (double)(end-start)/CLK_TCK);

    return 0;
}