Cod sursa(job #1587967)

Utilizator Ionut.popescuLiviu Rebreanu Ionut.popescu Data 2 februarie 2016 18:19:07
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <unordered_set>
#include <bitset>

using namespace std;

const int BITS = 8;
const int MASK = (1 << BITS) - 1;

bitset <1 << BITS> T[3][1 << BITS];
unordered_set <int> lazyErase;

void m_insert(int X) {
    for (int bucket = 0; bucket < 3; bucket++) {
        T[bucket][X & MASK][(X >> BITS) & MASK] = 1;
        X >>= BITS;
    }
}

bool m_find(int X) {
    int bucket = 0;

    while (bucket < 3 && T[bucket][X & MASK][(X >> BITS) & MASK]) {
        X >>= BITS;
        bucket++;
    }
    return (bucket == 3);
}

int main() {
    ifstream in("hashuri.in");
    in.tie(0);
    ios_base::sync_with_stdio(false);
    ofstream out("hashuri.out");
    int Q;
    int opType, arg;

    in >> Q;
    while (Q--) {
        in >> opType >> arg;
        if (opType == 1) {
            m_insert(arg);
            lazyErase.erase(arg);
        } else if (opType == 2) {
            lazyErase.insert(arg);
        } else {
            if (lazyErase.find(arg) == lazyErase.end() && m_find(arg)) {
                out << "1\n";
            } else {
                out << "0\n";
            }
        }
    }
    in.close();
    out.close();

    return 0;
}