Cod sursa(job #2751717)

Utilizator rimihaiMihai Radu-Ioan rimihai Data 15 mai 2021 17:45:01
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.92 kb
#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;
}