Pagini recente » Cod sursa (job #1553775) | Cod sursa (job #510902) | Cod sursa (job #2614675) | Cod sursa (job #1046200) | Cod sursa (job #2899214)
#include <iostream>
#include <fstream>
#include <set>
using namespace std;
ifstream in("zeap.in");
ofstream out("zeap.out");
string cerinta;
set <int> ab;
set<pair<int, pair<int, int>>> v;
void insereaza(int x)
{
//daca elem. nu se gaseste in zeap
if (ab.find(x)==ab.end())
{
ab.insert(x);
auto it=ab.find(x);
//daca exista predecesor in zeap
if (it!=ab.begin())
{
auto st=it;
st--;
v.insert(make_pair(x-*st, make_pair(*st, x)));
}
auto dr=it;
dr++;
if (dr!=ab.end())
v.insert(make_pair(*dr-x, make_pair(x, *dr)));
}
}
void sterge(int x)
{
auto it=ab.find(x);
if(it==ab.end())
{
out<<-1<<"\n";
return;
}
auto dr=it;
auto st=it;
auto it1=++it;
if (it!=ab.begin() && it1!=ab.end())
{
st--;
dr++;
//adaug stanga lui x-dreapta lui x
v.insert(make_pair(*dr-*st, make_pair(*st, *dr)));
//sterg perechile x-predecesor x, x-succesor x
v.erase(make_pair(x-*st, make_pair(*st, x)));
v.erase(make_pair(*dr-x, make_pair(x, *dr)));
}
else
{
if(it!=ab.begin() && it==ab.end())
v.erase(make_pair(x-*st, make_pair(*st, x)));
else if (it==ab.begin() && it!=ab.end())
v.erase(make_pair(*dr-x, make_pair(x, *dr)));
}
//sterg elementul x
ab.erase(x);
}
void afla_minim()
{
//daca am 0 sau un element in zeap, nu pot sa det. min.
if(ab.size()<=1)
out<<-1<<"\n";
else
{
//minimul e primul din multimea v, pt ca v e ordonata
out<<(*(v.begin())).first<<"\n";
}
}
void afla_maxim()
{
if (ab.size()<=1)
out<<-1<<"\n";
else
{
//maximul e diferenta distanta dintre ultimul si primul element
out<<*(--(ab.end()))-*(ab.begin())<<"\n";
}
}
int main()
{
int x;
while(in>>cerinta)
{
if(cerinta=="I")
{
in>>x;
insereaza(x);
continue;
}
if(cerinta=="S")
{
in>>x;
sterge(x);
continue;
}
if(cerinta=="C")
{
in>>x;
if(ab.find(x)!=ab.end())
out<<1<<"\n";
else
out<<0<<"\n";
continue;
}
if(cerinta=="MIN")
{
afla_minim();
continue;
}
if(cerinta=="MAX")
afla_maxim();
}
return 0;
}