Pagini recente » Cod sursa (job #2792362) | Cod sursa (job #3190894) | Cod sursa (job #70934) | Cod sursa (job #887900) | Cod sursa (job #2898476)
#include <iostream>
#include <fstream>
#include <set>
#include <queue>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
set <int> zeap;
string operatie;
int valoare;
typedef pair<int,pair<int,int>>pereche;//diferentele a cate 2 nr si numerele din care le am obtinut o
priority_queue<pereche, vector<pereche>, greater<pereche>> perechi;//diferentele in ordine crescatoare
void inserare(int x)
{
if(zeap.find(x) == zeap.end())//daca nu exista nr in zeap
{
zeap.insert(x);
set <int>::iterator st=zeap.find(x)--;
set <int>::iterator dr=st;
//introduc diferentele dintre numarul dat si vecinii din stanga,respectiv dreapta
if(st!=zeap.begin())
{
st--;
perechi.push(make_pair(x-*st, make_pair(*st, x)));//formez perechile inserand numerele in ordine crescatoare
}
dr++;
if(dr!=zeap.end())
{
perechi.push(make_pair(*dr-x, make_pair(x, *dr)));
}
}
}
void stergere(int x)
{
if(zeap.find(x)==zeap.end())
g<<"-1\n";
else
{
set <int>::iterator i1=zeap.find(x), i2=i1;
i2++;
if(i1!=zeap.begin() && i2!=zeap.end())
{
i1--;
perechi.push(make_pair(*i2-*i1,make_pair(*i1, *i2)));
}
zeap.erase(x);
}
}
void cautare(int x)
{
if(zeap.find(x)==zeap.end())
g<<"0\n";
else
g<<"1\n";
}
void max_dif()
{
if(zeap.size()<2)
g<<"-1\n";
else
{
set<int>::iterator p, u;
p=zeap.begin();
u=zeap.end();
u--;
g<<(*u-*p)<<'\n';
}
}
void min_dif()
{
if(zeap.size()<2)
g<<"-1\n";
else
{
//eliminare perechi cu noduri sterse
while(zeap.find(perechi.top().second.first)==zeap.end() || zeap.find(perechi.top().second.second)==zeap.end())
perechi.pop();
g<<perechi.top().first<<'\n';
}
}
int main()
{
while(f>>operatie)
{
if(operatie=="I")
{
f>>valoare;
inserare(valoare);
}
else if(operatie=="S")
{
f>>valoare;
stergere(valoare);
}
else if(operatie=="C")
{
f>>valoare;
cautare(valoare);
}
else if(operatie=="MAX")
max_dif();
else if(operatie=="MIN")
min_dif();
}
return 0;
}