Cod sursa(job #2336741)

Utilizator LucaSeriSeritan Luca LucaSeri Data 5 februarie 2019 15:32:49
Problema Zeap Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;

struct Node {
	Node *l = 0, *r = 0;
	int val, g;
	int mi, ma;
	int mindif;
	int cnt;
	Node(int val) : val(val), mi(val), ma(val), mindif(1e9), cnt(1), g(rand()) {}
	void recheck() {
		cnt = 1;
		mindif = 1e9;
		mi = ma = val;
		if(l) {
			mi = min(mi, l->mi);
			ma = max(ma, l->ma);
			mindif = min(mindif, val - l->ma);
			mindif = min(mindif, l->mindif);
			cnt += l->cnt;
		}
		if(r) {
			mi = min(mi, r->mi);
			ma = max(ma, r->ma);
			mindif = min(mindif, r->mi - val);
			mindif = min(mindif, r->mindif);
			cnt += r->cnt;
		}
	}
};

pair< Node*, Node* > split(Node* n, int k) {
	if(!n) return {0, 0};
	if(n->val > k) {
		auto pa = split(n->l, k);
		n -> l = pa.second;
		n -> recheck();
		return make_pair(pa.first, n);
	} else {
		auto pa = split(n->r, k);
		n -> r = pa.first;
		n -> recheck();
		return make_pair(n, 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);
		l -> recheck();
		return l;
	} else {
		r -> l = join(l, r->l);
		r -> recheck();
		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 pos) {
	return join(split(t, pos - 1).first, split(t, pos).second);
}

bool search(Node *t, int pos) {
	if(!t) return false;
	if(t->val == pos) return true;
	if(t->val > pos) return search(t->l, pos);
	return search(t->r, pos);
}

int main() {
	#ifdef BLAT
		freopen("input", "r", stdin);
	#else
	#endif

	ifstream f("zeap.in");
	ofstream g("zeap.out");

	Node* root = 0;
	string s;	
	int x;
	int y = 0;
	while(f >> s) {
		if(s == "I") {
			f >> x;
			if(!search(root, x)) root = ins(root, new Node(x));
		}
		if(s == "C") {
			f >> x;
			g << search(root, x) << '\n';
		}
		if(s == "S") {
			f >> x;
			if(!search(root, x)) g << "-1\n";
			else root = ers(root, x);
		}

		if(s == "MAX") {
			if(root->cnt < 2) g << "-1\n";
			else g << root->ma - root->mi << '\n';
		}

		if(s == "MIN") {
			if(root -> cnt < 2) g << "-1\n";
			else g << root->mindif << '\n';
		}
	}
}