Cod sursa(job #1180121)

Utilizator SpiderManSimoiu Robert SpiderMan Data 29 aprilie 2014 22:47:48
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

#define MOD 666013

ifstream f("hashuri.in");
ofstream g("hashuri.out");

int T, op, number, a[32];
vector<int> G[MOD];

void constructVector() {
    srand(time(0));
    for (int i = 0, value = rand() % 20810 + 1; i < 32; ++i, value += rand() % 20810 + 1)
        a[i] = value;
}

inline int h(int number) {
    int keyValue = 0;
    for (int i = 0; i < 32; ++i) {
        keyValue += a[i] * ((number & (1 << i)) != 0);
        if (keyValue > MOD) keyValue -= MOD;
    }
    return keyValue % MOD;
}

inline vector<int>::iterator findValue(int number) {
    int key = h(number);
    for (auto it = G[key].begin(); it != G[key].end(); ++it)
        if (*it == number)
            return it;
    return G[key].end();
}

inline void insertValue(int number) {
    int key = h(number);
    if (findValue(number) == G[key].end())
        G[key].push_back(number);
}

inline void eraseValue(int number) {
    int key = h(number);
    auto it = findValue(number);
    if (it != G[key].end())
        G[key].erase(it);
}

int main() {
    constructVector();
    for (f >> T; T; --T) {
        f >> op >> number;
        if (op == 1) insertValue(number);
        else if (op == 2) eraseValue(number);
        else g << (findValue(number) != G[h(number)].end()) << "\n";
    }
}