Pagini recente » Cod sursa (job #1775741) | Cod sursa (job #673605) | Autentificare | Cod sursa (job #958009) | Cod sursa (job #2898321)
#include <iostream>
#include <set>
#include <fstream>
#include <string>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
set<int>S;
multiset<int>difference;
void insereaza(set<int>& S, int element)
{
if (S.size() == 0)
{
S.insert(element);
return;
}
set<int>::iterator p2, p1;//p2 - elementul imediat mai mare ca element care se afla in set; p1 - element daca acesta se afla in set, altfel elementul imediat mai mic;
p2 = S.lower_bound(element);
p1 = p2; p1--;
if (p2 != S.end() && (*p2) == element) return;
if (p2 != S.begin() && p2 != S.end())
{
difference.erase(difference.find((*p2) - (*p1)));
difference.insert((*p2) - element);
difference.insert((element)-(*p1));
}
else if (p2 == S.begin()) // element este cel mai mic element din set;
difference.insert((*p2) - element);
else if (p2 == S.end()) // element este cel mai mare element din set;
difference.insert(element - (*p1));
S.insert(element);
}
void sterge(set<int>& S, int element)
{
if (S.size() == 1)
{
S.erase(element);
return;
}
if (S.find(element) == S.end() || S.size() == 0)
{
fout << "-1\n";
return;
}
else
{
set<int>::iterator p2, p1, p3;
p2 = S.lower_bound(element); //returneaza element;
p1 = p2, p1--;
p3 = p2, p3++;
p2++;
//Acum am in p2 elementul mai mare ca element si in p1 elementul mai mic ca element;
if (p2 == S.begin())
difference.erase(difference.find((*p3) - element));
else if (p3 == S.end())
{
difference.erase(element - (*p1));
}
else
{
difference.insert((*p3) - (*p1));
difference.erase(difference.find((*p3) - element));
difference.erase(difference.find(element - (*p1)));
}
S.erase(element);
}
}
int main()
{
string sir;
while (getline(fin, sir))
{
if (sir[0] == 'I')
{
int element = 0;
for (int i = 2; i < sir.size(); ++i)
element = element * 10 + int(sir[i] - '0');
insereaza(S, element);
}
else if (sir[0] == 'S')
{
int element = 0;
for (int i = 2; i < sir.size(); ++i)
element = element * 10 + int(sir[i] - '0');
sterge(S, element);
}
if (sir[0] == 'C')
{
int element = 0;
for (int i = 2; i < sir.size(); ++i)
element = element * 10 + int(sir[i] - '0');
if (S.find(element) != S.end())
{
fout << "1\n";
}
else fout << "0\n";
}
else if (sir == "MAX")
{
set<int>::iterator end = S.end();
end--;
fout << (*end) - (* S.begin()) << '\n';
}
else if (sir == "MIN")
{
fout << *(difference.begin()) << '\n';
}
}
return 0;
}