Cod sursa(job #2217010)

Utilizator ShutterflyFilip A Shutterfly Data 28 iunie 2018 17:06:02
Problema Oite Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <vector>
#include <stdio.h>

#define MASK 666013
using namespace std;

int v[1024];

int sums[MASK + 1];

int ptrToPair[1048577];
int pairval[1048577][2];
int GlobalLevel;

int main() {
    freopen("oite.in", "r", stdin);
    freopen("oite.out", "w", stdout);
    int n, sum;
    cin >> n >> sum;

    for (int i = 0; i < n; i++)
        cin >> v[i];

    for (int i = 0; i < n; i++) {
        for (int k = i + 1; k < n; k++) {
            int s = v[i] + v[k];
            s = s%MASK;
            GlobalLevel++;

            ptrToPair[GlobalLevel] = sums[s];
            sums[s] = GlobalLevel;

            pairval[GlobalLevel][0] = i;
            pairval[GlobalLevel][1] = k;
            //sums[s].push_back(make_pair(i, k));
        }
    }

    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int k = i + 1; k < n; k++) {
            int s = v[i] + v[k];
            //if (s > sum / 2) //Skip some unnecessary steps
                //continue;
            if (s >= sum)
                continue;
            int desiredSum = sum - s;

            int it = sums[desiredSum%MASK];
            while (it != 0) {
                int v1 = pairval[it][0];
                int v2 = pairval[it][1];
                if (v1 != i && v2 != i && v1 != k && v2 != k) {
                    if (v[v1]+ v[v2] == desiredSum) //Sanity Check
                        cnt++;
                }
                it = ptrToPair[it];
            }
        }
    }

    cout << cnt / 6;
}