Cod sursa(job #3134279)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 28 mai 2023 20:36:58
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.82 kb
#include <iostream>
#include <fstream>
#include <set>
#include <queue>
#include <climits>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
set<int> v;
pair <int, pair<int, int>> dmin;
void vinsert(int x){
    if(v.find(x) != v.end())
        return;
    v.insert(x);
                if(v.size() < 2)
                    return;
                if(dmin.first == INT_MAX)
                    return;
                auto pz = v.find(x);
                auto bb = next(pz);
                auto aa = prev(pz);
                //int b = *(bb);
                //cout << "I " <<x << " "<< a << " " << b << "\n";
                if(pz != v.begin() && *pz - *aa < dmin.first)
                {
                    dmin = {*pz - *aa, {*pz, *aa}};
                }
                if(bb != v.end() && *bb - *pz < dmin.first){
                    dmin = {*bb - *pz, {*bb, *pz}};
                }
}

void dmin_act(){
    //cout<<"@";
    if(dmin.first == INT_MAX){
        for(auto i = next(v.begin()); i != v.end(); i++){
            auto prv = prev(i);
            if(*i - *prv < dmin.first){
                dmin = {*i - *prv, {*i, *prv}};
            }
        }
    }
}

int main()
{
    dmin={INT_MAX, {0 ,0}};
    char c;
    while(f >> c){
        int x;
        if(c == 'I'){
            f >> x;
            vinsert(x);
        }
        else if(c == 'S'){
            f >> x;
            //cout << "S\n";
            //cout << x << " " << dmin.top().second.first << " " << dmin.top().second.second<<"\n";
            if(v.find(x) == v.end()){
                    g << -1 << "\n";
                    continue;
            }
                else{
                    v.erase(x);
                    if(dmin.second.first == x || dmin.second.second == x){
                        dmin.first = INT_MAX;
                    }
                }

        }
        else if(c == 'C'){
            f >> x;
                if(v.find(x) != v.end())
                    g << 1 << "\n";
                else
                    g << 0 << "\n";
        }
        else if(c == 'M'){
            f >> c;
            f >> c;
            //cout <<"MMN\n" << dmin.top().first << " "
            //<< dmin.top().second.first << " " << dmin.top().second.second << "\n";
                if(v.size() < 2)
                    g << -1 << "\n";
                else
                if(c == 'X'){
                    g << *v.rbegin() - *v.begin() << "\n";
                }else{
                    dmin_act();
                    g << dmin.first << "\n";
                }
        }
        /*switch(c){
            case 'I':
                f >> x;
                v.insert(x);
                int a = *v.lower_bound(x);
                int b = *v.upper_bound(x);
                int aux = min(abs(x-a), abs(x-b));
                if(aux == abs(x-a))
                    dmin.push({aux, {x, a}});
                else
                    dmin.push({aux, {x, b}});
            break;
            case 'S':
                f >> x;
                if(dmin.top().second.first == x ||
                dmin.top().second.second == x){
                    dmin.pop();
                }
                v.erase(x);
            break;
            case 'C':
                f >> x;
                if(v.find(x))
                    g << 1 << "\n";
                else
                    g << 0 << "\n";
            case 'M':
                f >> c;
                f >> c;
                if(v.size() < 2)
                    g << -1 << "\n";
                if(c == 'X'){
                    g << *v.rbegin() - *v.begin() << "\n";
                }else{
                    g << dmin.top().first << "\n";
                    dmin.pop();
                }
        }*/
    }
    return 0;
}