Cod sursa(job #2892403)

Utilizator EduardSanduSandu Eduard Alexandru EduardSandu Data 21 aprilie 2022 23:28:10
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.05 kb
#include <bits/stdc++.h>
using namespace std;

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

typedef pair<int, pair<int, int>> sablonP;

set<int> zeap; //BST implemented
set<int>::iterator it1, it2, it3;
priority_queue<sablonP, vector<sablonP>, greater<sablonP>> perechi;

void insereaza(int number)
{
    if(zeap.find(number) == zeap.end()) // daca nu exista deja nr
    {
        zeap.insert(number);
        it1 = zeap.find(number);
        it2 = it1;
        if(it1 != zeap.begin()) // caut vecinul din stanga daca nu e primul
        {
            it1--;
            int dif = abs(number - *it1);
            pair<int, int> p = {*it1, number};
            perechi.push({dif, p});
        }
        it2++;
        if(it2 != zeap.end()) // caut vecinul din dreapta daca nu e ultimul
        {
            int dif = abs(number - *it2);
            pair<int, int> p = {number, *it2};
            perechi.push({dif, p});
        }
    }
}

int stergere(int number)
{
    if(zeap.find(number) == zeap.end())
    {
        return -1;
    }
    it1 = zeap.find(number);
    it2 = it1;
    it3 = it1;
    it3 ++;
    if(zeap.begin() != it1 && zeap.end() != it3) // sa nu fie primul sau ultimul ca ne-a spart :))
    {
        it2++;
        it1--;
        int dif = abs(*it1 - *it2);
        pair<int, int> p = {*it1, *it2};
        perechi.push({dif, p});
    }
    zeap.erase(number);
    return 0;

}

int cauta(int number)
{
    if(zeap.find(number) != zeap.end())
        return 1;
    return 0;
}

int maxget()
{
    if(zeap.size() < 2)
            {
                return -1;
            }
            else
            {
                it1 = zeap.begin();
                it2 = zeap.end();
                it2--;
                return abs(*it2 - *it1);
            }
}

int minget()
{
    if(zeap.size() < 2)
        return -1;
    else
    {
        // elimin toate perechile care au noduri sterse

        while(zeap.find(perechi.top().second.first) == zeap.end() || zeap.find(perechi.top().second.second) == zeap.end())
        {
            perechi.pop();
        }
        return perechi.top().first;
    }
}

int main()
{
    string input, value;
    int number,result;

    while(getline(fin, input))
    {
        if(input[0] == 'I') // insereaza
        {
            input.erase(0,2);
            number = stoi(input);
            insereaza(number);
        }
        else if(input[0] == 'S') // sterge
        {
            input.erase(0,2);
            number = stoi(input);
            result = stergere(number);
            if(result == -1)
                fout<<-1<<'\n';
        }
        else if(input[0] == 'C') // cauta
        {
            input.erase(0,2);
            number = stoi(input);
            fout<<cauta(number)<<'\n';
        }
        else if(input[1] == 'A') // max
        {
            fout<<maxget()<<'\n';
        }
        else if(input[1] == 'I') // min
        {
            fout<<minget()<<'\n';
        }
    }
    return 0;
}