Cod sursa(job #2772337)

Utilizator AACthAirinei Andrei Cristian AACth Data 31 august 2021 19:24:26
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
#define cin f
#define cout g
const int Max = 1e5 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}

set < int > zeap;
struct pq_elem{
	int x,y;
	int dif;
};
bool operator < (const pq_elem& p1, const pq_elem& p2)
{
	//operator overload
	//return true daca p2 are prioritate mai mare decat p1 
	//conditia pe dos
	return p1.dif > p2.dif;
}
priority_queue < pq_elem > mindif;
void insereaza(int val)
{
	if(zeap.find(val) == zeap.end())
	{
		//daca nu e deja
		zeap.insert(val);
		auto before = zeap.find(val);
		if(before != zeap.begin())
		{
			//am ceva mai mic 	
			before --;
			mindif.push({val , *before,abs(val - *before)});
		}
		auto after = zeap.find(val);
		after ++;
		if(after!=zeap.end())
		mindif.push({val,*after,abs(val - *after)});
	}
}
void sterge(int val)
{
	if(zeap.find(val) == zeap.end())
		g<<"-1\n";
	else
	{
		
		auto before = zeap.find(val);
		auto after = zeap.find(val);
		after ++;
		if(after!=zeap.end() and before != zeap.begin())
		{
			before --;
			mindif.push({*before,*after,abs(*before - *after)});
		}
		zeap.erase(val);
	}
	
}
void cauta(int val)
{
	if(zeap.find(val) == zeap.end())
		cout<<"0\n";
	else
		cout<<"1\n";
}
void findmin()
{
	if(zeap.size() < 2)
	{
		cout<<"-1\n";
		return;
	}
	while(zeap.find(mindif.top().x) == zeap.end() or zeap.find(mindif.top().y) == zeap.end())
		mindif.pop();
	cout<<mindif.top().dif<<'\n';
}
void findmax(){
	if(zeap.size() < 2)
	{
		cout<<"-1\n";
		return;
	}
	auto small = zeap.begin();
	auto big = zeap.end();
	big --;
	cout<<abs(*small - *big)<<'\n';

}
int32_t main()
{
    string type;
    while(f>>type)
    {
    	if(type == "I")
    	{
    		//inserare
    		int val;
    		f>>val;
    		insereaza(val);
    	}
    	if(type == "S")
    	{
    		int val;
    		f>>val;
    		sterge(val);
    	}
    	if(type == "C")
    	{
    		int val;
    		f>>val;
    		cauta(val);
    	}
    	if(type == "MAX")
    	findmax();
    	if(type == "MIN")
    	{
    		//cout<<"min";
    		findmin();	
    		//cout<<"endmin";
    	}
    }
    return 0;
}