Cod sursa(job #3130583)

Utilizator KrisI77Iacovita Cristian KrisI77 Data 18 mai 2023 01:52:26
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb

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

int main() {
	std::ifstream fin("zeap.in");
	std::ofstream fout("zeap.out");
	
	std::set<int> set;
	std::map<int, int> diff;
	while (fin.good()) {
		char c;
		int x;
		fin >> c;
		switch (c)
		{
		case 'I':
		{
			fin >> x;
			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':
		{
			fin >> x;
			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 << '\n';
			break;
		}
		case 'C':
			fin >> x;
			if(set.find(x) != set.end())
				fout << 1 << '\n';
			else
				fout << 0 << '\n';
			break;
		case 'M':
			fin >> c;
			if (c == 'A') {
				if (set.size() > 1)
					fout << *set.rbegin() - *set.begin() << '\n';
				else
					fout << -1 << '\n';
			}
			else {
				if (set.size() > 1) {
					fout << diff.begin()->first << '\n';
				}
				else
					fout << -1 << '\n';
			}
			fin >> c;
			break;
		}
	}
	return 0;
}