Pagini recente » Cod sursa (job #2965457) | Cod sursa (job #2529647) | Cod sursa (job #2661992) | Cod sursa (job #1071977) | Cod sursa (job #2892403)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
typedef pair<int, pair<int, int>> sablonP;
set<int> zeap; //BST implemented
set<int>::iterator it1, it2, it3;
priority_queue<sablonP, vector<sablonP>, greater<sablonP>> perechi;
void insereaza(int number)
{
if(zeap.find(number) == zeap.end()) // daca nu exista deja nr
{
zeap.insert(number);
it1 = zeap.find(number);
it2 = it1;
if(it1 != zeap.begin()) // caut vecinul din stanga daca nu e primul
{
it1--;
int dif = abs(number - *it1);
pair<int, int> p = {*it1, number};
perechi.push({dif, p});
}
it2++;
if(it2 != zeap.end()) // caut vecinul din dreapta daca nu e ultimul
{
int dif = abs(number - *it2);
pair<int, int> p = {number, *it2};
perechi.push({dif, p});
}
}
}
int stergere(int number)
{
if(zeap.find(number) == zeap.end())
{
return -1;
}
it1 = zeap.find(number);
it2 = it1;
it3 = it1;
it3 ++;
if(zeap.begin() != it1 && zeap.end() != it3) // sa nu fie primul sau ultimul ca ne-a spart :))
{
it2++;
it1--;
int dif = abs(*it1 - *it2);
pair<int, int> p = {*it1, *it2};
perechi.push({dif, p});
}
zeap.erase(number);
return 0;
}
int cauta(int number)
{
if(zeap.find(number) != zeap.end())
return 1;
return 0;
}
int maxget()
{
if(zeap.size() < 2)
{
return -1;
}
else
{
it1 = zeap.begin();
it2 = zeap.end();
it2--;
return abs(*it2 - *it1);
}
}
int minget()
{
if(zeap.size() < 2)
return -1;
else
{
// elimin toate perechile care au noduri sterse
while(zeap.find(perechi.top().second.first) == zeap.end() || zeap.find(perechi.top().second.second) == zeap.end())
{
perechi.pop();
}
return perechi.top().first;
}
}
int main()
{
string input, value;
int number,result;
while(getline(fin, input))
{
if(input[0] == 'I') // insereaza
{
input.erase(0,2);
number = stoi(input);
insereaza(number);
}
else if(input[0] == 'S') // sterge
{
input.erase(0,2);
number = stoi(input);
result = stergere(number);
if(result == -1)
fout<<-1<<'\n';
}
else if(input[0] == 'C') // cauta
{
input.erase(0,2);
number = stoi(input);
fout<<cauta(number)<<'\n';
}
else if(input[1] == 'A') // max
{
fout<<maxget()<<'\n';
}
else if(input[1] == 'I') // min
{
fout<<minget()<<'\n';
}
}
return 0;
}