Cod sursa(job #2752110)

Utilizator monicaandreea46Girbea Monica monicaandreea46 Data 16 mai 2021 18:16:57
Problema Zeap Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <iostream>
#include <fstream>
#include<vector>
#include <map>
#include <set>
#include <queue>

FILE *f = fopen( "zeap.in", "r");
FILE *g = fopen( "zeap.out", "w");

char s[10], *p;
int x;
std::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 citeste(){
    while(*p < '0' || *p>'9')
        p++;

    int nr = 0;

    while( *p >= '0' && *p <='9'){
        nr = nr *10 + (*p-'0');
        p++;
    }
    return nr;
}

int main()
{
    while(fgets(s, 10, f) != nullptr){
        p = s;
        if(s[0]=='I')
        {
            x = citeste();
            insereaza(x);
        }
        if(s[0]=='S')
        {
            x = citeste();
            int rez = sterge(x);
            if(rez == -1) fprintf( g, "-1\n");
        }
        if(s[0]=='C')
        {
            x = citeste();
            int rez = cauta(x);
            fprintf( g, "%d\n", rez);
        }
        if(s[1]=='A')
        {
            int rez = maxdif();
            fprintf( g, "%d\n", rez);
        }
        if(s[1]=='I')
        {
            int rez = mindif();
            fprintf( g, "%d\n", rez);
        }
    }

    return 0;
}