Pagini recente » Diferente pentru info-oltenia-2018/individual/clasament/10 intre reviziile 4 si 1 | Cod sursa (job #1232642) | Cod sursa (job #1792729) | Cod sursa (job #1126667) | Cod sursa (job #2337552)
#include <bits/stdc++.h>
using namespace std;
struct Node {
Node *l = 0, *r = 0;
int val, g;
Node(int val): val(val), g(rand()) {}
};
pair< Node*, Node* > split(Node *t, int k) {
if(!t) return {};
if(t->val >= k) {
auto pa = split(t->l, k);
t->l = pa.second;
return {pa.first, t};
} else {
auto pa = split(t->r, k);
t->r = pa.first;
return {t, pa.second};
}
}
Node* join(Node* l, Node*r) {
if(!l) return r;
if(!r) return l;
if(l->g > r->g) {
l->r = join(l->r, r);
return l;
} else {
r->l = join(l, r->l);
return r;
}
}
Node* ins(Node* t, Node* n) {
auto pa = split(t, n->val);
return join(join(pa.first, n), pa.second);
}
Node* ers(Node* t, int k) {
auto pa = split(t, k);
auto u = split(pa.second, k + 1);
if(u.first) delete(u.first);
return join(pa.first, u.second);
}
bool src(Node *t, int k) {
if(!t) return false;
if(t->val == k) return true;
if(t->val > k) return src(t->l, k);
return src(t->r, k);
}
Node* root[666013];
int main() {
#ifdef BLAT
freopen("input", "r", stdin);
#define f cin
#define g cout
#else
ifstream f("hashuri.in");
ofstream g("hashuri.out");
#endif
int t;
f >> t;
while(t--) {
int a, x;
f >> a >> x;
int idx = x % 666013;
if(a == 1) {
if(!src(root[idx], x)) root[idx] = ins(root[idx], new Node(x));
}
if(a == 2) {
if(src(root[idx], x)) root[idx] = ers(root[idx], x);
}
if(a == 3) {
g << src(root[idx], x) << '\n';
}
}
}