Cod sursa(job #3134247)

Utilizator DariusGhercaDarius Gherca DariusGherca Data 28 mai 2023 19:55:54
Problema Zeap Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.89 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;
priority_queue <pair<int, pair<int,int>>> dmin;

void vinsert(int x){
    v.insert(x);
                if(v.size() < 2)
                    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 " << a << " " << b << "\n";
                int aux = min(abs(x == a ? INT_MAX : x-a), abs(x == b ? INT_MAX : x-b ));
                if(aux == abs(x-a))
                    dmin.push({-aux, {x, a}});
                else
                    dmin.push({-aux, {x, b}});
}

int main()
{
    dmin.push({-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";
                else
                    v.erase(x);
                if(dmin.top().second.first == x){
                    v.erase(dmin.top().second.second);
                    vinsert(dmin.top().second.second);
                    dmin.pop();
                }
                else if(dmin.top().second.second == x){
                    v.erase(dmin.top().second.first);
                    vinsert(dmin.top().second.first);
                    dmin.pop();
                }

        }
        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";
                if(c == 'X'){
                    g << *v.rbegin() - *v.begin() << "\n";
                }else{
                    g << -dmin.top().first << "\n";
                    dmin.pop();
                }
        }
        /*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;
}