Cod sursa(job #2897723)

Utilizator Andreeamiruna27Mindrescu Andreea Andreeamiruna27 Data 4 mai 2022 17:05:26
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("zeap.in");
ofstream g("zeap.out");

set <int> zeap;
struct compare
{
    bool operator()(const pair<int,int> &a, const pair<int,int> &b) {
        return abs(a.first - a.second) > abs(b.first - b.second);
    }
};
priority_queue<pair<int,int>, vector<pair<int,int>>, compare> minidif;

void insereaza(int a)
{
    if(zeap.count(a)==0)
    {
        zeap.insert(a);
        set<int>::iterator x, y;
        x=zeap.find(a);
        y=zeap.find(a);
        x++;
        if(y!=zeap.begin())
        {
            y--;
            minidif.push(make_pair(a, *y));
        }
        if(x!=zeap.end())
        {
            minidif.push(make_pair(*x, a));
        }
    }
}

int stergere(int a)
{
    if(zeap.count(a)==0)
    {
        return -1;
    }
    else
    {
        set<int>::iterator x, y;
        x=zeap.find(a);
        y=zeap.find(a);
        y++;
        if(y!=zeap.end() and x!=zeap.begin())
        {
            x--;
            minidif.push(make_pair(*y, *x));
        }
        zeap.erase(a);
        return 1;
    }
}

int cautare(int a)
{
    return zeap.count(a);
}

int mindif()
{
    if(zeap.size()<2)
        return -1;
    else
    {
        while(!(zeap.count(minidif.top().first)==1 && zeap.count(minidif.top().second)==1))
        {
           minidif.pop();
        }
        return abs(minidif.top().first-minidif.top().second);
    }
}
int maxidif()
{
    if(zeap.size()<2)
        return -1;
    else
    {
        set<int>::iterator x, y;
        x=zeap.begin();
        y=zeap.end();
        y--;
        return abs(*y-*x);
    }
}

int main(){
    int a;
    string op;

    while(f>>op){
        if(op=="I"){
            f>>a;
            insereaza(a);

        }
        else if(op=="S"){
            f>>a;
            if(stergere(a)==-1)
                g<<-1<<'\n';

        }
        else if(op=="C"){
            f>>a;
            g<<cautare(a)<<'\n';
        }
        else if(op=="MAX"){
            g<<maxidif()<<'\n';
        }
        else if(op=="MIN"){
            g<<mindif()<<'\n';

        }




    }

    return 0;
}