Cod sursa(job #2053790)

Utilizator mlc_oficialBoris Barca mlc_oficial Data 1 noiembrie 2017 12:41:48
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
#include <cstring>
#include <fstream>
#include <cctype>

using namespace std;

constexpr int kBuffSize = 498765;

int to[kBuffSize][1 << 5];

inline char GetChar() {
    static constexpr int kBuffSize = (1 << 17);
    static char buff[kBuffSize];
    static int pointer = kBuffSize;
    if (pointer == kBuffSize) {
        fread(buff, 1, kBuffSize, stdin);
        pointer = 0;
    }    
    return buff[pointer++];
}
 
inline int ReadInt() {
    char c;
    do { c = GetChar(); } while (not isdigit(c));
     
    int number = 0;
    do {
        number = (number << 1) + (number << 3) + (c - '0');
        c = GetChar();
    } while (isdigit(c));
    return number;
}

int stk[1 << 17], stack_size;

int GetFreeIdx() {
    static int buffer_idx = 1;
    return stack_size > 0 ? stk[--stack_size] : buffer_idx++;
}

void InsertTrie(int number) {
    int node = 0;
    for (int i = 0; i < 6; i += 1) {
        int& x = to[node][number & 31];
        if (x == -1) {
            x = GetFreeIdx();    
        }
        
        node = x;
        number >>= 5;
    }
}

void EraseTrie(int number) {
    int node = 0;
    for (int i = 0; i < 5; i += 1) {
        int& x = to[node][number & 31];
        if (x == -1) {
            return;
        }
        
        node = x;
        number >>= 5;
    }
    stk[stack_size++] = to[node][number & 31];
    to[node][number & 31] = -1;
}

bool QueryTrie(int number) {
    int node = 0;
    for (int i = 0; i < 6; i += 1) {
        int& x = to[node][number & 31];
        if (x == -1) {
            return false;
        }
        
        node = x;
        number >>= 5;
    }    
    return true;
}

int main() {
    #ifdef INFOARENA
    freopen("hashuri.in", "r", stdin);
    freopen("hashuri.out", "w", stdout);
    #endif
    
    memset(to, -1, sizeof to);
    
    int q = ReadInt();
    while (q--) {
        int type = ReadInt(), number = ReadInt();
        if (type == 1) {
            InsertTrie(number);
        } else if (type == 2) {
            EraseTrie(number);
        } else {
            putchar_unlocked(QueryTrie(number) + '0');
            putchar_unlocked('\n');
        }
    }
}