Cod sursa(job #1690920)

Utilizator ArkinyStoica Alex Arkiny Data 16 aprilie 2016 11:46:44
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include<fstream>
#include<algorithm>
#include<set>
#include<stdlib.h>
#include<iostream>
#include<map>
using namespace std;

int v[50010], s[50010], m[50010];

ifstream in("zeap.in");
ofstream out("zeap.out");
int N, K;
multiset<int> dif;
set<int> Set;
std::pair<std::set<int>::iterator, bool> ret;
int main()
{
	char c;
	int nr;
	while (in >> c)
	{
		if (c == 'I')
		{
			in >> nr;
			ret=Set.insert(nr);
			if (ret.second)
			{
				if (!ret.first._Ptr->_Parent->_Isnil)
					dif.insert(abs(ret.first._Ptr->_Myval - ret.first._Ptr->_Parent->_Myval));
			}
			
		}
		else if (c == 'S')
		{
			in >> nr;
			auto e = Set.find(nr);
			if (e != Set.end())
			{
				if (!e._Ptr->_Left->_Isnil)
				{
					dif.erase(dif.find(abs(e._Ptr->_Myval - e._Ptr->_Left->_Myval)));
				}
				if (!e._Ptr->_Right->_Isnil)
				{
					dif.erase(dif.find(abs(e._Ptr->_Myval - e._Ptr->_Right->_Myval)));
				}
				if (!e._Ptr->_Parent->_Isnil)
				{
					dif.erase(dif.find(abs(e._Ptr->_Myval - e._Ptr->_Parent->_Myval)));
				}
				e--;
				Set.erase(nr);
				dif.insert(abs(*e - *(++e)));
			}
			else
				out << "-1\n";
		}
		else if(c=='C')
		{
			in >> nr;
			if (Set.find(nr) == Set.end())
				out << "0\n";
			else
				out << "1\n";
		}
		else
		{
			in >> c;

			if (c == 'A')
			{
				if (Set.size() >= 2)
					out << abs(*(Set.rbegin()) - *(Set.begin()))<<'\n';
				
				else
					out << "-1\n";
			}
			else if(c == 'I')
			{
				if (Set.size() >= 2)
				{
					out << dif.begin()._Ptr->_Myval << '\n';
				}
				else
					out << "-1\n";
			}
			in >> c;
		}
	}

	return 0;
}