Pagini recente » Cod sursa (job #2958287) | Cod sursa (job #2567904) | Cod sursa (job #2958493) | Cod sursa (job #2762958) | Cod sursa (job #3135653)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
const int NMAX = 300005;
set <int> Zeap;
priority_queue< pair<int, pair<int,int>> > pq;
/// bagam toate elementele cu -(minus) in fatza ca sa avem minimul
void Inserare(int x){
if(Zeap.count(x) == 0){
Zeap.insert(x);
if(Zeap.size() > 1){
/// bagam in pq diferentele dintre x si elementele de langa el
set<int>::iterator it = Zeap.find(x);
if(it == Zeap.begin()){ /// exceptie elementul ar fi primul
int diff_dr = abs(*(++it) - x);
pq.push({-diff_dr,make_pair(*it,x)});
return;
}
if((++it) == Zeap.end()){ /// exceptie elementul ar fi ultimul
--it;
int diff_st = abs(*(--it) - x);
pq.push({-diff_st,make_pair(*it,x)});
return;
}
--it;
int diff_st = abs(*(--it) - x);
pq.push({-diff_st,make_pair(*it,x)});
++it;
int diff_dr = abs(*(++it) - x);
pq.push({-diff_st,make_pair(*it,x)});
--it;
return;
}
}
}
int Sterge(int x){
if(Zeap.count(x) == 0) return -1;
set<int>::iterator it = Zeap.find(x);
if(it == Zeap.begin()){ Zeap.erase(x); return 1337; }
if((++it) == Zeap.end()){ Zeap.erase(x); return 1337; }
/// nu se produce nicio diferenta noua cand sterg primul/ultimul element
--it;
set<int>::iterator stanga = it;
set<int>::iterator dreapta = it;
--stanga;
++dreapta;
int new_dif = abs(*stanga - *dreapta);
pq.push({-new_dif,make_pair(*stanga,*dreapta)});
/// noua diferenta creata este cu elementul din stanga celui sters
/// si elementul din dreapta celui sters
/// ca in Zuma daca stii ce zic <3
Zeap.erase(x);
return 1337;
}
int Cauta(int x){
return Zeap.count(x);
}
int Max_Dif(){
/// cel mai mic si cel mai mare element produc diff maxima
if(Zeap.size() < 2) return -1;
int minim = *Zeap.begin();
int maxim = *(--Zeap.end());
return maxim-minim;
}
int Min_Dif(){
if(Zeap.size() < 2) return -1;
while(true){
int Apare_NrStanga = Zeap.count(pq.top().second.first);
int Apare_NrDreapta = Zeap.count(pq.top().second.second);
if(Apare_NrStanga == 0 or Apare_NrDreapta == 0) pq.pop();
else return -pq.top().first;
/// verific daca acea diferenta minima din varf e valida
/// valida inseamna ca ambele elementele sunt inca in set
/// e mai usor asa decat sa actualizez PQ de fiecare data cand sterg elemente
}
}
int getNumar(string lin){
string numar = "";
for(int i=2;i<lin.size();i++){
numar += lin[i];
}
int num = stoi(numar);
return num;
}
void procesare(string lin){
if(lin[0] == 'I'){ /// inserare
int num = getNumar(lin);
Inserare(num);
}
if(lin[0] == 'S'){ /// stergere
int num = getNumar(lin);
if(Sterge(num) != 1337){
fout << -1 << '\n';
}
}
if(lin[0] == 'C'){ /// cautare
int num = getNumar(lin);
fout << Cauta(num) << '\n';
}
if(lin[1] == 'A'){ /// maxim
fout << Max_Dif() << '\n';
}
if(lin[1] == 'I'){ /// minim
fout << Min_Dif() << '\n';
}
}
void citire(){
while(!fin.eof()){
string linie;
getline(fin,linie);
if(linie.size() == 0) break;
procesare(linie);
}
}
int main()
{
citire();
return 0;
}