Cod sursa(job #2898241)

Utilizator BojneaguBojneagu David-Alexandru Bojneagu Data 6 mai 2022 14:30:28
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
#include <set>
#include <iterator>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
string op;
int nr;
set<int> zeap; // am folosit set deoarece asta se foloseste la bst
set<int>::iterator minim, maxim, it , st , dr;
priority_queue<pair<int, pair<int, int> >, vector< pair < int, pair <int, int> > >, greater<pair< int, pair<int, int > > > >   prque_min;
// eu am in prque practic fiecare minim dintre numere, si cele 2 numere. este evident de ce tinem minimul dintre ele
// dar pastram si cele 2 numere ca sa ne fie mai usor sa eliminam valabilitatea acelui minim in caz ca unul dintre
// elemente le stergem. verificam daca cele 2 nr din care minimul actual este format mai exista, si daca da
// inseamna ca este valabil.
void insereaza() {
	if (zeap.find(nr) == zeap.end())
	{
		zeap.insert(nr);
		 it = zeap.find(nr);
			if (it != zeap.begin())
			{
				it--;
				prque_min.push(make_pair(nr - *it, make_pair(*it, nr)));
				it++;
			}
			if (++it != zeap.end())
				prque_min.push(make_pair(*it - nr, make_pair(*it, nr)));
	}
}
void sterge() {
	if (zeap.find(nr) == zeap.end())
	{
		fout << "-1\n";
	}
	else {
		 it = zeap.find(nr);
		if (it != zeap.begin())
		{
			it++;
			if (it != zeap.end())
			{
				dr = it;
				it--;
				st = --it;
				prque_min.push(make_pair(*dr - *st, make_pair(*dr, *st))); // in caz ca avem 2 fi sa nu ratam diferenta minima dintre ei
			}
		}
		zeap.erase(nr);
	}
}
bool cauta() {
	if (zeap.find(nr) == zeap.end())
		return 0;
	else
		return 1;
}
int max_dif() {
	if (zeap.size() > 1)
	{
		maxim = zeap.end();
		minim = zeap.begin();
		maxim--;
		return (*maxim - *minim); // cum este sortat crescator, fiind set, vine ultimul - primul
	}
	else
		return -1;
}
int min_dif() {
	if (zeap.size() > 1)
	{
		while (zeap.find(prque_min.top().second.first) == zeap.end() || zeap.find(prque_min.top().second.second) == zeap.end())
		{
			prque_min.pop(); // elimin elementele care le am sters intre timp
		}
		return prque_min.top().first;
	}
	else
		return  -1; 
}
int main() {

	while (getline(fin, op))
	{
		switch (op[0]) {
		case 'I' :
			op.erase(0, 2);
			nr = stoi(op);
			insereaza();
			break;
			
		case 'S' :
			op.erase(0, 2);
			nr = stoi(op);
			sterge();
			break;

		case 'C':
			op.erase(0, 2);
			nr = stoi(op);
			fout << cauta() << "\n";
			break;
		case  'M' : 
			switch (op[1]) {
			case 'A' :
				fout << max_dif() << "\n";
				break;

			case 'I' :
				fout << min_dif() << "\n";
				break;
			}
			 break;
		}
	}
	fin.close();
	fout.close();
	return 0;
}