Cod sursa(job #2892763)

Utilizator matei123Biciusca Matei matei123 Data 23 aprilie 2022 15:39:21
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> per;
ifstream f("zeap.in");
ofstream g("zeap.out");
priority_queue <pair<int, per>, vector<pair<int, per>>, greater<pair<int, per>>> pq;
set <int> zeap;
string operatie;

void insereaza(int x) {
    if(zeap.count(x) == 0) {
        zeap.insert(x);
        if(zeap.size() >= 2) {
            auto index_x = zeap.find(x);
            if(index_x != zeap.begin()) {
                auto index_stanga = index_x;
                --index_stanga;
                pq.push(make_pair(abs(*index_stanga - x),
                                                   make_pair(*index_stanga, x)));
            }
            auto index_dreapta = index_x;
            ++index_dreapta;
            if(index_dreapta != zeap.end())
                pq.push(make_pair(abs(x - *index_dreapta),
                                                   make_pair(x, *index_dreapta)));
        }
    }
}

int sterge(int x) {
    if(zeap.count(x) == 0)
        return -1;
    auto index_x = zeap.find(x);
    auto index_dreapta = index_x;
    ++index_dreapta;
    auto index_stanga = index_x;
    --index_stanga;
    if(index_dreapta != zeap.end() and index_x != zeap.begin())
        pq.push(make_pair(abs(*index_stanga - *index_dreapta),
                                           make_pair(*index_stanga, *index_dreapta)));
    zeap.erase(x);
    return 1;
}

bool cauta(int x) {
    if(zeap.count(x))
        return 1;
    return 0;
}

int max_dif() {
    if(zeap.size() < 2)
        return -1;
    auto sfarsit = zeap.end();
    --sfarsit;
    auto inceput = zeap.begin();
    return *sfarsit - *inceput;
}

int min_dif() {
    if(zeap.size() < 2)
        return -1;
    while(zeap.count(pq.top().second.first) == 0 or
                zeap.count(pq.top().second.second) == 0)
                pq.pop();
    return pq.top().first;
}

int main() {
    int x;
    while(f >> operatie)
        if(operatie == "I") {
            f >> x;
            insereaza(x);
        }
        else
            if(operatie == "S") {
                f >> x;
                int value = sterge(x);
                if(value == -1)
                    g << -1 << '\n';
            }
            else
                if(operatie == "C") {
                    f >> x;
                    g << cauta(x) << '\n';
                }
                else
                    if(operatie == "MAX")
                        g << max_dif() << '\n';
                    else
                        g << min_dif() << '\n';

    return 0;
}