Cod sursa(job #2752042)

Utilizator monicaandreea46Girbea Monica monicaandreea46 Data 16 mai 2021 15:13:25
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <iostream>
#include <fstream>
#include<vector>
#include <unordered_map>
#include <set>
#include <queue>

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

std::string s;
int x;
std::unordered_map<int, int> map; //pt diferente + daca exista
std::set<int> set; //pt numere
std::priority_queue<int> pq; //tin diferentele pe minus ca sa il am pe cel mai mic in top

void insereaza(int x){
    if( set.find(x) != set.end() ) return;

    auto it = set.insert( set.begin(), x);
    auto it_st = it;
    it_st--;
    auto it_dr = it;
    it_dr++;

    if( it!= set.begin() && it_dr!=set.end() ){ //nu e nici primy nici ultimul
        int val = abs(*it_dr - *it_st );
        map[val]--; //diferenta dintre dreapta si stanga nu mai e minima 
    }

    if( it != set.begin() ){ //nu e primu (adaugam noile diferente daca e la mijloc)
        int val = abs( *it - *it_st );
        map[val]++;
        if(map[val]==1) pq.push(-val);
    }

    if( it_dr != set.end() ){ //nu e ultimu
        int val = abs( *it_dr - *it );
        map[val]++;
        if(map[val]==1) pq.push(-val);
    }
}

int sterge(int x){
    if( set.find(x) != set.end()){
        auto it = set.find(x);
        auto it_st = it;
        it_st--;
        auto it_dr = it;
        it_dr++;

        if( it!= set.begin() && it_dr!=set.end() ){ //adaug suma dintre st si dr
            int val = abs(*it_dr - *it_st );
            map[val]++;
            if(map[val]==1) pq.push(-val);
        }

        if( it != set.begin() ){
            int val = abs( *it - *it_st );
            map[val]--;
        }

        if( it_dr != set.end() ){
            int val = abs( *it_dr - *it );
            map[val]--;
        }

        set.erase(it);
        return 0;
    }

    return -1;
}

int cauta(int x){
    if(set.find(x) != set.end())
        return 1;
    else return 0;
}

int maxdif(){
    if(set.size()>=2){
        auto it = set.end();
        it--;
        return abs(*set.begin() - *it);
    }
    return -1;
}

int mindif(){
    if(set.size()>=2){
        while( !pq.empty() && map[-pq.top()] <= 0 )
            pq.pop();
        return -pq.top();
    }
    return -1;
}

int main()
{
    while(!f.eof()){
        f>>s;
        if(s=="I")
        {
            f>>x;
            insereaza(x);
        }
        if(s=="S")
        {
            f>>x;
            int rez = sterge(x);
            if(rez == -1) std::cout<<"-1\n";
        }
        if(s=="C")
        {
            f>>x;
            std::cout<<cauta(x)<<"\n";
        }
        if(s=="MAX")
        {
            std::cout<<maxdif()<<"\n";
        }
        if(s=="MIN")
        {
            std::cout<<mindif()<<"\n";
        }
    }

    return 0;
}