Pagini recente » Cod sursa (job #640028) | Cod sursa (job #2041676) | Cod sursa (job #1033413) | Cod sursa (job #2484830) | Cod sursa (job #1457217)
#include <bits/stdc++.h>
using namespace std;
typedef int var;
struct SkipList {
#define MAXD 20
#define INF 2e9
struct nod {
var val, sz;
nod **leg;
nod(var k, var sz) {
this->sz = sz;
val = k;
leg = new nod*[sz];
}
};
typedef nod* pnod;
pnod root, nill;
pnod stop[MAXD];
SkipList() {
root = new nod(-1, MAXD);
nill = new nod(INF, 0);
for(var d=0; d<MAXD; d++)
root->leg[d] = nill;
}
pnod find(var val) {
pnod p = root;
for(var d=MAXD-1; d>=0; d--) {
while(p->leg[d]->val < val)
p = p->leg[d];
stop[d] = p;
}
p = p->leg[0];
if(p->val == val) return p;
return NULL;
}
void insert(var val) {
if(find(val)) return;
var sz = 1;
while(rand() % 5 <= 2) sz++;
sz = min(MAXD, sz);
pnod p = new nod(val, sz);
for(var d=0; d<sz; d++) {
p->leg[d] = stop[d]->leg[d];
stop[d]->leg[d] = p;
}
}
void erase(var val) {
pnod p = find(val);
if(p == NULL) return;
for(var d=0; d<p->sz; d++) {
stop[d]->leg[d] = p->leg[d];
}
delete[] p->leg;
delete p;
}
};
SkipList T;
#define DIM 100000
char buff[DIM];
var poz = DIM - 1;
void Read(var &a) {
while(!isdigit(buff[poz]))
if(++poz == DIM)
fread(buff, 1, DIM, stdin), poz=0;
a = 0;
while(isdigit(buff[poz])) {
a = a * 10 + buff[poz] - '0';
if(++poz == DIM)
fread(buff, 1, DIM, stdin), poz=0;
}
}
int main() {
freopen("hashuri.in", "r", stdin);
freopen("hashuri.out", "w", stdout);
srand(time(NULL));
var m, t, a;
Read(m);
while(m--) {
Read(t); Read(a);
if(t == 1) T.insert(a);
else if(t == 2) T.erase(a);
else printf("%d\n", (T.find(a) != NULL));
}
return 0;
}