Pagini recente » Cod sursa (job #3199593) | Cod sursa (job #2793112) | Cod sursa (job #2575486) | Cod sursa (job #1254227) | Cod sursa (job #2751717)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("zeap.in");
ofstream out ("zeap.out");
bool compare(const pair<int,int> &a,const pair<int,int> &b)
{
return a.first-a.second > b.first-b.second; /// sortam perechile dupa dif minima
}
set <int> Set;
string comanda;
priority_queue < pair<int,int> , vector<pair<int,int>> , decltype(&compare) > diferente(compare);
set<int>::iterator first, last;
int main()
{
while(in>>comanda)
{
if(comanda=="I") ///citim elementul, verificam daca este in set
{
int x;
in>>x;
auto p = Set.find(x);
if(p == Set.end()) ///daca elementul nu este in set, atunci il inseram si punem diferenta dintre cele 2 pozitii vecine in pq
{
Set.insert(x);
p = Set.find(x);
if(p != Set.begin())
{
auto q=p;
--q;
diferente.push({*p, *q});
}
auto q=p;
++q;
if(q != Set.end())
{
diferente.push({*q, *p});
}
}
}
if(comanda=="S") ///stergem elementul daca se gaseste in set si adaugam noua diferenta
{
int x;
in>>x;
auto gasire=Set.find(x);
if(gasire!=Set.end())
{
auto d=gasire;
d++;
if(gasire!=Set.begin() && d!=Set.end())
{
gasire--;
diferente.push({*d,*gasire});
}
Set.erase(x);
}
else out<<-1<<'\n';
}
if(comanda=="C") ///cautam elementul in set
{
int x;
in>>x;
if(Set.find(x)!=Set.end())
out<<1<<'\n';
else out<<0<<'\n';
}
if(comanda=="MIN") ///verificam in pq daca elementele sunt inca in set, daca ambele sunt inca in set atunci afisam diferenta
{
if(Set.size()<2)
out<<-1<<'\n';
else
{
while( Set.find(diferente.top().first)==Set.end() || Set.find(diferente.top().second)==Set.end())
{
diferente.pop();
}
out<<diferente.top().first-diferente.top().second<<'\n';
}
}
if(comanda=="MAX") ///afisam maximul, care e diferenta dintre primul element din set si ultimul element din set
{
if(Set.size()<2)
out<<-1<<'\n';
else
{
int poz1,poz2;
first=Set.begin();
last=Set.end();
last--;
out<<(*last-*first)<<'\n';
}
}
}
return 0;
}