Cod sursa(job #3134280)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 28 mai 2023 20:37:32
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.05 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){
    v.insert(x);
                if(v.size() < 2)
                    return;
                if(dmin.first == INT_MAX)
                    return;
                auto aa = v.find(x);
                auto bb = next(aa);
                int a;
                if(aa == v.begin())
                    a = x;
                else{
                    aa = prev(aa);
                    a = *(aa);
                }
                int b;
                if(bb == v.end())
                    b = x;
                else
                    b = *(bb);
                //int b = *(bb);
                //cout << "I " <<x << " "<< a << " " << b << "\n";
                int aux = min(abs(x == a ? INT_MAX : x-a), abs(x == b ? INT_MAX : x-b ));
                if(aux < dmin.first)
                if(aux == abs(x-a))
                    dmin={aux, {x, a}};
                else
                    dmin={aux, {x, b}};
}

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, {*prv, *i}};
            }
        }
    }
}

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;
}