Cod sursa(job #2336171)

Utilizator flibiaVisanu Cristian flibia Data 4 februarie 2019 20:45:06
Problema Zeap Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>

using namespace std;

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

int x;
string s;
set <int> h;
multiset <int> v;

int main() {
	while (getline(in, s)) {
		if (s[0] == 'M') {
			if (s[2] == 'X') {
				if (h.size() < 2)
					out << "-1\n";
				else {
					auto it = h.begin();
					auto it2 = h.end();
					it2--;
					out << *it2 - *it << '\n';
				}
			} else {
				if (v.empty())
					out << "-1\n";
				else out << *v.begin() << '\n';
			}
			continue;
		}
		int p = 0;
		x = 0;
		while (p < s.size() && !isdigit(s[p]))
			p++;
		while (p < s.size() && isdigit(s[p]))
			x = 10 * x + s[p++] - '0';
		if (s[0] == 'C') {
			if (h.find(x) != h.end())
				out << "1\n";
			else out << "0\n";
			continue;
		}
		if (s[0] == 'I') {
			if (h.find(x) == h.end()) {
				h.insert(x);
				if (h.size() >= 2) {
					auto it = h.lower_bound(x);
					if (it == h.begin()) {
						auto it2 = it;
						it2++;
						v.insert(*it2 - *it);
					} else {
						auto it2 = it;
						it2--;
						auto it3 = h.end();
						it3--;
						if (it == it3) 
							v.insert(*it - *it2);
						else {
							it3 = it;
							it3++;
							v.erase(v.find(*it3 - *it2));
							v.insert(*it - *it2);
							v.insert(*it3 - *it);
						}
					}
				}
			}	
			continue;
		}
		if (h.find(x) == h.end()) {
			out << "-1\n";
			continue;
		}
		if (h.size() == 1) {
			h.erase(h.begin());
			continue;
		}
		auto it = h.lower_bound(x);
		if (it == h.begin()) {
			auto it2 = it;
			it2++;
			v.erase(v.find(*it2 - *it));
			h.erase(it);
			continue;
		}
		auto it2 = it;
		it2--;
		auto it3 = h.end();
		it3--;
		if (it3 == it) {
			v.erase(v.find(*it - *it2));
			h.erase(it);
			continue;
		}
		v.erase(v.find(*it - *it2));
		v.erase(v.find(*it3 - *it));
		v.insert(*it3 - *it2);
		h.erase(it);
	}
	return 0;
}