Pagini recente » Cod sursa (job #338133) | Cod sursa (job #3145894) | Cod sursa (job #1254631) | Cod sursa (job #1740142) | Cod sursa (job #2898245)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <queue>
#include <vector>
#include <tuple>
#include <set>
std::ifstream fileIn ("zeap.in");
std::ofstream fileOut("zeap.out");
class my_greater {
public:
bool operator() ( std::tuple<int, int, int>& arg1, std::tuple<int, int, int>& arg2) const
{
return std::get<0>(arg1) > std::get<0>(arg2);
return false;
}
};
typedef std::priority_queue<std::tuple<int, int, int>, std::vector<std::tuple<int, int, int>>, my_greater> pQ; // definesc pQ tip minHeap cu tuplu mai sus si regulile de comp
std::set<int> zeap; // pt operatiile I,S,C,MAX
pQ minDif; // minHEAP care are <diferenta,elem 1, elem2>// elem 1 si 2 sunt si in set
void inserare(int nr){
zeap.insert(nr); // pun in set
// pt min heap tb sa vad in set in stg si dr elem inserat
std::set<int> ::iterator it;
it = zeap.find(nr);
std::set<int> ::iterator inainte(zeap.find(nr)), dupa(zeap.find(nr));
inainte --;
dupa ++;
if(it != zeap.begin()) { //DACA elem nostru NU E PRIMUL IN zeap
minDif.push(std::make_tuple(*(it)-*inainte, *it, *inainte));
//std::cout << *(it)-*inainte<< *it << *inainte <<'\n';
}
if(it != --zeap.end()) { //DACA elem nostru NU E ULTIMUL IN zeap
minDif.push(std::make_tuple(*dupa-*(it), *dupa, *it));
//std::cout << *dupa-*(it) << *dupa << *it<<'\n';
}
}
bool cautare(int nr) {
if(zeap.find(nr) == zeap.end()) {
return 0;
}
else {
return 1;
}
}
int difMin() {
std::tuple<int,int,int> tuplu(minDif.top());
while(!cautare(std::get<1>(tuplu)) || !cautare(std::get<2>(tuplu))) {
minDif.pop();
tuplu = minDif.top();
}
return std::get<0>(tuplu);
}
void stergere(int nr) {
//atentie la stergere tb sa adaug diferente noi
std::set<int> ::iterator it(zeap.find(nr)), inainte(zeap.find(nr)), dupa(zeap.find(nr));
--inainte;
++dupa;
zeap.erase(it); // il sterg
//agaug diferenta succesor - predecesor in pQ minDif
if(inainte != --zeap.begin()&& dupa != zeap.end()) { //DACA predecesorul si succesorul exista
minDif.push(std::make_tuple(*dupa-*inainte, *inainte, *dupa));
//std::cout << *dupa-*inainte<< *inainte<< *dupa<<'\n';
}
//std::cout << "sa vad daca chiar am sters" <<cautare(nr) << "\n";
}
int main(){
char comanda;
int arg;
while(fileIn>>comanda) {
//std::cout<< comanda<<'\n';
switch (comanda){
case 'I': {
///INSERARE
fileIn >> arg;
//std::cout <<"INSERARE "<< int(arg)<<'\n';
inserare(arg);
break;
}
case 'S': {
///STERGERE
fileIn >> arg;
//std::cout <<"STERGERE: "<< int(arg)<<'\n';
if(!cautare(arg)) {
fileOut << "-1"<<'\n';
//std::cout << "-1";
}
else{
stergere(arg);
}
break;
}
case 'C': {
///CAUTARE
fileIn >> arg;
//std::cout <<"CAUTARE: "<< int(arg)<<'\n';
//std::cout<<cautare(arg)<<'\n';
fileOut << cautare(arg)<<'\n';
break;
}
case 'M': {
fileIn >> comanda;
if(comanda=='I') {
///MIN
//std::cout <<"MIN " <<'\n';
if(zeap.size() >= 2){
fileOut << difMin()<<'\n';
//std::cout << difMin();
}
else {
fileOut << "-1"<<'\n';
//std::cout << "-1";
}
}
else {///MAX
//std::cout <<"MAX " <<'\n';
if(zeap.size() >= 2){
//std::cout << *(--zeap.end()) - *(zeap.begin())<<'\n';
fileOut << *(--zeap.end()) - *(zeap.begin())<<'\n';
}
else {
fileOut << "-1"<<'\n';
//std::cout << "-1";
}
}
break;
}
}
}
return 0;
}