Pagini recente » Cod sursa (job #404882) | Cod sursa (job #341911) | Cod sursa (job #1706390) | Cod sursa (job #1577920) | Cod sursa (job #2899615)
#include <iostream>
#include <fstream>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
multiset<int> dif;
set<int> multime;
set<int>::iterator poz_el_curent,poz_el_precedent,poz_el_succesor;
int main()
{
ifstream f("zeap.in");
ofstream g("zeap.out");
string instr;
int nr;
while(f>>instr)
{
if(instr[0]=='I')
{
f>>nr;
if(multime.count(nr)==0)
{
multime.insert(nr);
//retinem pozitia la care se afla elementul inserat in multime
poz_el_curent=multime.find(nr);
//daca multimea contine cel putin 2 elemente, atunci putem calcula min_dif
if(multime.size()>=2)
{
poz_el_succesor=poz_el_curent;
poz_el_succesor++;
poz_el_precedent=poz_el_curent;
poz_el_precedent--;
//verificam pozitia elementului nou inserat. Daca acesta e primul element din multime, atunci calculam diferenta dintre acesta
//si elementul din dreapta, daca este ultimul element din multime, atunci calculam diferenta dintre acesta si elementul din stanga sa, iar daca se afla
//oriunde altundeva in multime, atunci adaugam in multiset cele doua diferente
if(poz_el_curent==multime.begin())
{
dif.insert(*poz_el_succesor-*poz_el_curent);
}
else
if(poz_el_succesor==multime.end())
{
dif.insert(*poz_el_curent-*poz_el_precedent);
}
else
{ //stergem diferenta dintre elementele vecine de dinainte de inserare
dif.erase(dif.find(*poz_el_succesor-*poz_el_precedent));
//introducem noile diferente rezultate prin inserarea unui nou element
dif.insert(*poz_el_curent-*poz_el_precedent);
dif.insert(*poz_el_succesor-*poz_el_curent);
}
}
}
}
else
if(instr[0]=='S')
{
f>>nr;
if(multime.count(nr)>0)
{ poz_el_curent=multime.find(nr);
if(multime.size()>=2)
{
poz_el_succesor=poz_el_curent;
poz_el_succesor++;
poz_el_precedent=poz_el_curent;
poz_el_precedent--;
//repetam aceeasi structura ca la inserare; verificam pozitia elementului pe care dorim sa il stergem
if(poz_el_curent==multime.begin())
{
dif.erase(dif.find(*poz_el_succesor-*poz_el_curent));
}
else
if(poz_el_succesor==multime.end())
{
dif.erase(dif.find(*poz_el_curent-*poz_el_precedent));
}
else
{ //reintroducem diferenta care se afla in multiset inainte de inserarea elementului pe care urmeaza sa il stergem
dif.insert(*poz_el_succesor-*poz_el_precedent);
dif.erase(dif.find(*poz_el_curent-*poz_el_precedent));
dif.erase(dif.find(*poz_el_succesor-*poz_el_curent));
}
}
multime.erase(poz_el_curent);
}
else
g<<"-1\n";
}
else
if(instr[0]=='C')
{
f>>nr;
if(multime.count(nr)>0)
{
g<<"1\n";
}
else
g<<"0\n";
}
else
if( instr[0]=='M' && instr[1]=='A')
{
if(multime.size()>=2)
{
poz_el_precedent=multime.begin();
poz_el_succesor=multime.end();
poz_el_succesor--;
g<<*poz_el_succesor-*poz_el_precedent<<"\n";
}
else
g<<"-1\n";
}
else
if(instr[0]=='M' &&instr[1]=='I')
{
if(multime.size()>=2)
{
g<<*dif.begin()<<"\n";
}
else
{
g<<"-1\n";
}
}
}
return 0;
}