Pagini recente » Cod sursa (job #1216956) | Cod sursa (job #2307027) | Cod sursa (job #1944533) | Cod sursa (job #126253) | Cod sursa (job #3129650)
#include <iostream>
#include <fstream>
#include <set>
#include <string>
#include <sstream>
#include <climits>
std::ifstream in("../zeap.in");
std::ofstream out("../zeap.out");
std::set<int> zeap;
std::pair<int, std::pair<int,int>> dif_mn;
/// valoare dif min valorile din care este obt
void insert(int x)
{
if(zeap.find(x) == zeap.end())
{
zeap.insert(x);
auto itx = zeap.find(x);
auto st = prev(itx);
auto dr = next(itx);
if(itx!=zeap.begin() && x - *st < dif_mn.first)
dif_mn = std::make_pair(x - *st, std::make_pair(*st, x));
if(dr!=zeap.end() && *dr - x < dif_mn.first)
dif_mn = std::make_pair(*dr - x, std::make_pair(x, *dr));
}
}
std::string sterge(int x)
{
if(zeap.find(x) == zeap.end())
return "-1";
else
{
auto it = zeap.find(x);
zeap.erase(it);
if(dif_mn.second.first == x || dif_mn.second.second == x)
dif_mn = std::make_pair(INT_MAX, std::make_pair(0,0));
/// daca nu mai exista niciun insert dupa delete, calculez diferenta minima in apelul dif min,
/// pt eficienta.
return "";
}
}
std::string dif_min()
{
if(zeap.size() < 2)
return "-1";
else if(dif_mn.first == INT_MAX)
{
for(auto i = zeap.begin(); i!=zeap.end(); i++)
{
auto st = prev(i);
if(*i - *st)
dif_mn = std::make_pair(*i - *st, std::make_pair(*i, *st));
}
}
return std::to_string(dif_mn.first);
}
std::string dif_max()
{
if(zeap.size() < 2)
return "-1";
else
return std::to_string(*(zeap.rbegin()) - *(zeap.begin()));
}
int main()
{
std::string op;
dif_mn = std::make_pair(INT_MAX, std::make_pair(0,0));
while(in>>op)
{
if(op == "I")
{
int x;
in>>x;
insert(x);
}
else if(op == "S")
{
int x;
in>>x;
auto rez = sterge(x);
if(rez != "")
out<<rez<<'\n';
}
else if(op == "MAX")
out<<dif_max()<<'\n';
else if(op == "MIN")
out<<dif_min()<<'\n';
else if(op == "C")
{
int x;
in>>x;
out<<(zeap.find(x) != zeap.end() ? "1" : "0")<<'\n';
}
}
return 0;
}