Pagini recente » Cod sursa (job #2013760) | Cod sursa (job #2046642) | Cod sursa (job #1956989) | Cod sursa (job #954996) | Cod sursa (job #2752045)
#include <iostream>
#include <fstream>
#include<vector>
#include <unordered_map>
#include <set>
#include <queue>
std::ifstream f("zeap.in");
std::ofstream g("zeap.out");
std::string s;
int x;
std::unordered_map<int, int> map; //pt diferente + daca exista
std::set<int> set; //pt numere
std::priority_queue<int> pq; //tin diferentele pe minus ca sa il am pe cel mai mic in top
void insereaza(int x){
if( set.find(x) != set.end() ) return;
auto it = set.insert( set.begin(), x);
auto it_st = it;
it_st--;
auto it_dr = it;
it_dr++;
if( it!= set.begin() && it_dr!=set.end() ){ //nu e nici primy nici ultimul
int val = abs(*it_dr - *it_st );
map[val]--; //diferenta dintre dreapta si stanga nu mai e minima
}
if( it != set.begin() ){ //nu e primu (adaugam noile diferente daca e la mijloc)
int val = abs( *it - *it_st );
map[val]++;
if(map[val]==1) pq.push(-val);
}
if( it_dr != set.end() ){ //nu e ultimu
int val = abs( *it_dr - *it );
map[val]++;
if(map[val]==1) pq.push(-val);
}
}
int sterge(int x){
if( set.find(x) != set.end()){
auto it = set.find(x);
auto it_st = it;
it_st--;
auto it_dr = it;
it_dr++;
if( it!= set.begin() && it_dr!=set.end() ){ //adaug suma dintre st si dr
int val = abs(*it_dr - *it_st );
map[val]++;
if(map[val]==1) pq.push(-val);
}
if( it != set.begin() ){
int val = abs( *it - *it_st );
map[val]--;
}
if( it_dr != set.end() ){
int val = abs( *it_dr - *it );
map[val]--;
}
set.erase(it);
return 0;
}
return -1;
}
int cauta(int x){
if(set.find(x) != set.end())
return 1;
else return 0;
}
int maxdif(){
if(set.size()>=2){
auto it = set.end();
it--;
return abs(*set.begin() - *it);
}
return -1;
}
int mindif(){
if(set.size()>=2){
while( !pq.empty() && map[-pq.top()] <= 0 )
pq.pop();
return -pq.top();
}
return -1;
}
int main()
{
while(!f.eof()){
f>>s;
if(s=="I")
{
f>>x;
insereaza(x);
}
if(s=="S")
{
f>>x;
int rez = sterge(x);
if(rez == -1) g<<"-1\n";
}
if(s=="C")
{
f>>x;
g<<cauta(x)<<"\n";
}
if(s=="MAX")
{
g<<maxdif()<<"\n";
}
if(s=="MIN")
{
g<<mindif()<<"\n";
}
}
return 0;
}