Cod sursa(job #3135591)

Utilizator KrisI77Iacovita Cristian KrisI77 Data 3 iunie 2023 18:56:40
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb

#include <fstream>
#include <set>
#include <map>
#include <string>

int main() {
	std::ifstream fin("zeap.in");
	std::ofstream fout("zeap.out");

	std::set<long long> set;
	std::map<long long, long long> diff;

	char c[16];
	long long x;
	while (fin.getline(c, 16)) {
		switch (c[0])
		{
		case 'I':
		{
			std::string str = c;
			x = std::stoll(str.substr(2));

			if (set.find(x) != set.end())
				break;
			if (set.size() > 0) {
				auto next = set.upper_bound(x);
				if (next == set.end()) {
					next = std::prev(next);
					++diff[x - *next];
				}
				else {
					++diff[*next - x];
					if (next != set.begin()) {
						next = std::prev(next);
						++diff[x - *next];
					}
				}
			}
			set.insert(x);
			break;
		}
		case 'S':
		{
			std::string str = c;
			x = std::stoll(str.substr(2));

			auto xpos = set.find(x);
			if (xpos != set.end()) {
				if (set.size() > 1) {
					auto next = std::next(xpos);
					if (next != set.end()) {
						--diff[*next - x];
						if (diff[*next - x] == 0)
							diff.erase(*next - x);
					}
					if (xpos != set.begin()) {
						next = std::prev(xpos);
						--diff[x - *next];
						if (diff[x - *next] == 0)
							diff.erase(x - *next);

						auto prev = next;
						next = std::next(xpos);
						if (next != set.end())
							++diff[*next - *prev];
					}
				}
				set.erase(x);
			}
			else
				fout << -1 << std::endl;
			break;
		}
		case 'C':
		{
			std::string str = c;
			x = std::stoll(str.substr(2));

			if (set.find(x) != set.end())
				fout << 1 << std::endl;
			else
				fout << 0 << std::endl;
			break;
		}
		case 'M':
		{
			if (c[1] == 'A') {
				if (set.size() > 1)
					fout << *set.rbegin() - *set.begin() << std::endl;
				else
					fout << -1 << std::endl;
			}
			else {
				if (set.size() > 1) {
					fout << diff.begin()->first << std::endl;
				}
				else
					fout << -1 << std::endl;
			}
			break;
		}
		}
	}
	return 0;
}