Cod sursa(job #2121812)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 4 februarie 2018 12:57:00
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <vector>
#include <algorithm>

#define MOD 666013

using std::vector;
using std::binary_search;

int n;
vector<int> hashTable[MOD];

inline void get(int x) {
    binary_search(
        hashTable[x % MOD].begin(), hashTable[x % MOD].end(),
        x
    ) ? printf("1\n") : printf("0\n");
}

void add(int x) {
    int y = x % MOD;
    int m, st = -1, dr = hashTable[y].size();

    while (dr - st > 1) {
        m = (st + dr) / 2;
        if (x > hashTable[y][m])
            st = m;
        else if (x < hashTable[y][m])
            dr = m;
        else
            return;
    }
    hashTable[y].insert(hashTable[y].begin() + dr, x);
}

void del(int x) {
    int y = x % MOD;
    int m, st = -1, dr = hashTable[y].size();

    while (dr - st > 1) {
        m = (st + dr) / 2;
        if (x > hashTable[y][m])
            st = m;
        else if (x < hashTable[y][m])
            dr = m;
        else {
            hashTable[y].erase(hashTable[y].begin() + m, hashTable[y].begin() + m + 1);
            return;
        }
    }
}

int main() {
    int type, val;
    freopen("hashuri.in", "r", stdin);
    freopen("hashuri.out", "w", stdout);

    scanf("%d\n", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d\n", &type, &val);
        if (type == 1)
            add(val);
        else if (type == 2)
            del(val);
        else
            get(val);
    }

    fclose(stdout);
    return 0;
}