Mai intai trebuie sa te autentifici.
Cod sursa(job #1970006)
Utilizator | Data | 18 aprilie 2017 19:49:18 | |
---|---|---|---|
Problema | Hashuri | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.34 kb |
#include <bits/stdc++.h>
using namespace std;
class node {
public:
int p;
int v;
int sz;
node *l;
node *r;
node(int _p = 0,
int _v = 0,
int _sz = 0,
node *_l = nullptr,
node *_r = nullptr) {
p = _p;
v = _v;
sz = _sz;
l = _l;
r = _r;
}
};
mt19937 gen;
node *nil = new node();
node *write(node *old, node *le, node *ri) {
old->sz = le->sz + 1 + ri->sz;
old->l = le;
old->r = ri;
return old;
}
pair <node*, node*> split(node *x, int val) {
if (x == nil) {
return {nil, nil};
}
node *ls;
node *rs;
if (x->v <= val) {
node *nls;
node *nrs;
tie(nls, nrs) = split(x->r, val);
ls = write(x, x->l, nls);
rs = nrs;
return {ls, nrs};
}
else {
node *nls;
node *nrs;
tie(nls, nrs) = split(x->l, val);
ls = nls;
rs = write(x, nrs, x->r);
return {ls, rs};
}
}
node *merge(node *l, node *r) {
if (l == nil) return r;
if (r == nil) return l;
if (l->p <= r->p) return write(l, l->l, merge(l->r, r));
else return write(r, merge(l, r->l), r->r);
}
node *insert(node *x, int v) {
node *y = new node(gen(), v, 1, nil, nil);
node *l;
node *r;
tie(l, r) = split(x, v);
return merge(merge(l, y), r);
}
node *erase(node *x, int v) {
node *l;
node *r;
tie(l, r) = split(x, v);
node *nl;
node *nr;
tie(nl, nr) = split(l, v - 1);
return merge(nl, r);
}
bool search(node *x, int v) {
if (x == nil) return 0;
if (x->v == v) {
return 1;
}
else {
if (x->v < v) {
return search(x->r, v);
}
else return search(x->l, v);
}
}
int main() {
ifstream cin("hashuri.in");
ofstream cout("hashuri.out");
gen = mt19937(time(nullptr));
node *x = nil;
int n;
cin >> n;
while (n--) {
int t;
int v;
cin >> t >> v;
if (t == 1) {
if (search(x, v) == 0) {
x = insert(x, v);
}
}
else {
if (t == 2) {
if (search(x, v) == 1) {
x = erase(x, v);
}
}
else {
cout << search(x, v) << "\n";
}
}
}
return 0;
}