Pagini recente » Cod sursa (job #1009729) | Cod sursa (job #2226931) | Cod sursa (job #796559) | Cod sursa (job #1212431) | Cod sursa (job #2053790)
#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');
}
}
}