Cod sursa(job #3135149)

Utilizator LazarDanielGabrielLazar Daniel-Gabriel LazarDanielGabriel Data 2 iunie 2023 00:30:16
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <iostream>
#include <fstream>
#include <set>
#include <queue>
#include <cmath>
using namespace std;

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

struct Zeap {
    set<int> nums;
    priority_queue<int> max_diff;
    priority_queue<int, vector<int>, greater<int>> min_diff;

    void insert(int x) {
        if (nums.count(x)) return;
        nums.insert(x);
        updateDiff();
    }

    int remove(int x) {
        if (!nums.count(x)) return -1;
        nums.erase(x);
        updateDiff();
        return 1;
    }

    int search(int x) {
        return nums.count(x);
    }

    int maxDiff() {
        if (nums.size() < 2) return -1;
        int max_difference = *(--nums.end()) - *(nums.begin());
        return max_difference;
    }

    int minDiff() {
        if (nums.size() < 2) return -1;
        return min_diff.top();
    }

    void updateDiff() {
        if (nums.size() < 2) {
            max_diff = priority_queue<int>();
            min_diff = priority_queue<int, vector<int>, greater<int>>();
            return;
        }

        max_diff = priority_queue<int>();
        min_diff = priority_queue<int, vector<int>, greater<int>>();

        auto it1 = nums.begin();
        auto it2 = next(it1);

        while (it2 != nums.end()) {
            max_diff.push(*it2 - *it1);
            min_diff.push(*it2 - *it1);
            ++it1;
            ++it2;
        }
    }
};

int main() {
    Zeap Z;

    string command;
    int x;

    while (fin >> command) {
        if (command == "I") {
            fin >> x;
            Z.insert(x);
        }
        else if (command == "S") {
            fin >> x;
            int result = Z.remove(x);
            if (result == -1) {
                fout << -1 << '\n';
            }
        }
        else if (command == "C") {
            fin >> x;
            int result = Z.search(x);
            fout << result << '\n';
        }
        else if (command == "MAX") {
            int result = Z.maxDiff();
            fout << result << '\n';
        }
        else if (command == "MIN") {
            int result = Z.minDiff();
            fout << result << '\n';
        }
    }

    fin.close();
    fout.close();

    return 0;
}