Cod sursa(job #2751763)

Utilizator serafimalex2001Serafim Alex serafimalex2001 Data 15 mai 2021 19:17:19
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <set>
#include <queue>
#include <iterator>
using namespace std;

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

typedef pair<int,int> pii;

struct compare{
    bool operator()(const pair<int, pii>& a, const pair<int, pii>& b){
        return a.first > b.first;
    }
};

set<int> z;
priority_queue<pair<int, pii>, vector<pair<int, pii>>, compare> mindif, maxdif;

void getmax(){
    if(z.size() < 2)
        fout << "-1\n";
    else fout<< *(z.rbegin()) - *(z.begin())<< "\n";
}

void getmin(){
    if(mindif.empty())
        {
            fout << "-1\n";
            return;
        }
    int n1 = mindif.top().second.first;
    int n2 = mindif.top().second.second;
    while(z.find(n1) == z.end() || z.find(n2) == z.end()){
        mindif.pop();
        if(mindif.empty())
        {
            fout << "-1\n";
            return;
        }
        n1 = mindif.top().second.first;
        n2 = mindif.top().second.second;
    }
    fout<< mindif.top().first<< "\n";
}

void print(){
    set < int > ::iterator it;
    for(it = z.begin(); it != z.end(); ++it)
        cout << *it << " ";
    cout << "\n";
}

void operatie(char str[]){
    int i = 2;
    int nr = 0;
    int pred,succ;
    pair<set<int>::iterator,bool> ret;
    set<int>::iterator it1, it2;

    if(str[0] == 'C' || str[0] == 'I' || str[0] == 'S'){
        while(isdigit (str[i])){
            nr = nr*10 + (str[i] - '0');
            i++;
        }
    }
    switch(str[0]){
        case 'C':
            fout << !(z.find(nr) == z.end()) << "\n";
            break;

        case 'I':
            ret = z.insert(nr); /// daca a fost inserat in set, adaugam diferenta dintre el si succesor in pq
            if(ret.second != false){
                it1 = ret.first;
                if (it1 != z.begin()) {
                    --it1;
                    mindif.push({nr - *it1,{nr, *it1}});
                }
                it2 = ret.first;
                it2++;
                if (it2 != z.end()) {
                    mindif.push({*it2 - nr,{nr, *it2}});
                }
            }
            break;

        case 'S':
            if(z.find(nr) == z.end())
                fout << "-1\n";
            else z.erase(nr);
            break;

        default:
            if(str[1] == 'A')
                getmax();
            else getmin();
            break;
    }
}

void solve(){
    char str[20];
    while(true){
        fin.getline(str, 20);
        if( fin.eof() )
            break;
        operatie(str);
    }
}

int main()
{
    solve();
    return 0;
}