Cod sursa(job #2337552)

Utilizator LucaSeriSeritan Luca LucaSeri Data 6 februarie 2019 15:30:15
Problema Hashuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#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';
		}
	}
}