Cod sursa(job #2899615)

Utilizator CosminaBuruianaCosmina Buruiana CosminaBuruiana Data 8 mai 2022 23:28:40
Problema Zeap Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.48 kb
#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;
}