Pagini recente » Cod sursa (job #1466642) | Cod sursa (job #2394526) | Cod sursa (job #2559719) | Cod sursa (job #579037) | Cod sursa (job #2898287)
#include <iostream>
#include <set>
#include <fstream>
#include <string>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
set<int>numere;
set<int>difference;
void insereaza(set<int>&S, int element)
{
if (S.size() == 0)
{
S.insert(element);
return;
}
if (S.find(element) == S.end())
{
set<int>::iterator p1, p2;//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--;
S.insert(element);
if (p2 != S.begin() && p2 != S.end())
{
difference.erase((*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));
}
}
void sterge(set<int>&S, int element)
{
if (S.size() == 0)
{
S.erase(element);
return;
}
if (S.find(element) == S.end())
{
fout << "-1\n";
}
else
{
set<int>::iterator p2, p1;
p2 = S.lower_bound(element); //element;
p1 = p2, p1--;
p2++;
//Acum am in p2 elementul mai mare ca element si in p1 elementul mai mic ca element;
if (S.find(element) != S.begin() && S.find(element) != S.end())
{
difference.insert((*p2) - (*p1));
difference.erase(difference.find((*p2) - element));
difference.erase(difference.find(element - (*p1)));
}
else if (S.find(element) == S.begin())
{
difference.erase((*p2) - element);
}
else
{
difference.erase(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(numere, 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(numere, element);
}
if (sir[0] == 'C')
{
int element = 0;
for (int i = 2; i < sir.size(); ++i)
element = element * 10 + int(sir[i] - '0');
if (numere.find(element) != numere.end())
{
fout << "1\n";
}
else fout << "0\n";
}
else if (sir == "MAX")
{
set<int>::iterator end = numere.end();
end--;
fout << (*end) - (*numere.begin()) << '\n';
}
else if (sir == "MIN")
{
fout << *(difference.begin())<<'\n';
}
}
return 0;
}