Cod sursa(job #3135528)

Utilizator Catalin12Cata Caraulasu Catalin12 Data 3 iunie 2023 15:51:25
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.3 kb
#include <iostream>
#include <fstream>
#include <set>
#include <cstring>

using namespace std;

ifstream in("zeap.in");
ofstream out("zeap.out");

set<int>::iterator i, index1, index2,new_i;
multiset<int>::iterator mini; /// minimurile din zeap

char op[12];
set<int> zeap;
multiset<int> zmin;

int main()
{
    while (in.getline(op,13))
    {

        if (op[0]=='I') /// inserare
        {
            char p[12];
            strcpy(p,op+2);
            int sum=0;
            for( int i = 0 ; i<strlen(p);i++)
            {
                sum*=10;
                sum+=p[i]-'0';

            }

            if (zeap.find(sum) == zeap.end())
            {
                zeap.insert(sum);
                i = zeap.find(sum);

                if (i != zeap.begin()) /// punem minimul dintre el si cel de dinaintea lui in zmin
                {
                    index1=i;
                    index1--;
                    zmin.insert(*i - *index1);
                }

                index2=i;
                index2++;
                if (index2 != zeap.end()) /// punem minimul dintre el si cel de dupa el in zmin
                    zmin.insert(*index2 - *i);
            }
        }
        else if (op[0]=='S') /// stergere
        {
            char p[12];
            strcpy(p,op+2);
            int sum=0;
            for( int i = 0 ; i<strlen(p);i++)
            {
                sum*=10;
                sum+=p[i]-'0';

            }
            i=zeap.find(sum); /// analogic inserarii , cu cel de dinainte de el si cel de dupa el
            if(i==zeap.end())
                out<<-1<<endl;
            else
            {
                if (i!=zeap.begin())
                {
                    index1=i;
                    index1--;
                    zmin.erase(zmin.find(*i - *index1));

                    new_i=i;
                    new_i++;
                    if (new_i != zeap.end())
                        zmin.insert(*new_i - *index1);
                }

                index2=i;
                index2++;
                if (index2 != zeap.end())
                    zmin.erase(zmin.find(*index2 - *i));

                zeap.erase(i);
            }
        }
        else if (op[0]=='C') ///cautare
        {
            char p[12];
            strcpy(p,op+2);
            int sum=0;
            for( int i = 0 ; i<strlen(p);i++)
            {
                sum*=10;
                sum+=p[i]-'0';

            }

            i=zeap.find(sum);
            if (i != zeap.end())
                out<<1<<endl;
            else
                out<<0<<endl;
        }

        else if (op[1]=='I') ///min, primul element din multiset-ul zmin
        {
            if (zmin.empty())
                out<<-1<<endl;
            else
            {
                mini=zmin.begin();
                out<<*mini<<endl;
            }
        }
        else if (op[1]=='A') ///max, diferenta dintre maxim si minim din zeap
        {
            if (zeap.size()<2)
                out<<-1<<endl;
            else
            {
                index2=zeap.end();
                index2--;
                index1=zeap.begin();

                out<<*index2 -*index1<<endl;
            }
        }
    }

    return 0;
}