Cod sursa(job #1608512)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 22 februarie 2016 10:01:51
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <fstream>
#include <iostream>
#include <set>
#include <string>
using namespace std;

struct zeap
{
    set< int > v;
    multiset< int > diff;
    
    void insert(int);
    int erase(int);
    bool find(int);
    int max_dif();
    int min_dif();
};

zeap v;

int getInt(const string&);

int main()
{
    int val;
    string buff;
    ifstream fin("zeap.in");
    ofstream fout("zeap.out");
    
    while(getline(fin, buff))
    {
        switch(buff[0])
        {
            case 'I':
                val = getInt(buff);
                v.insert(val);
                break;
                
            case 'S':
                val = getInt(buff);
                if(v.erase(val) == -1) fout << -1 << '\n';
                break;
                
            case 'C':
                val = getInt(buff);
                fout << v.find(val) << '\n';
                break;
                
            default:
                if(buff[1] == 'A')
                    fout << v.max_dif() << '\n';
                else
                    fout << v.min_dif() << '\n';
                break;
        }
    }
    
    return 0;
}

int getInt(const string& s)
{
    int x, pos;
    for(x = 0, pos = s.find(' ') + 1; pos < s.length(); ++pos)
        x = x * 10 + s[pos] - '0';
    
    return x;
}

void zeap::insert(int x)
{
    auto ret = v.insert(x);
    if(ret.second == false) return;
    
    set< int >::iterator it1, it2, it3;
    it1 = it2 = it3 = ret.first;
    --it1; ++it3;
    
    if(it2 != v.begin() && it3 != v.end())
    {
        diff.erase(diff.find((*it3) - (*it1)));
    }
    if(it2 != v.begin())
    {
        diff.insert((*it2) - (*it1));
    }
    if(it3 != v.end())
    {
        diff.insert((*it3) - (*it2));
    }
}

int zeap::erase(int x)
{
    auto it = v.find(x);
    if(it == v.end()) return -1;
    
    set< int >::iterator it1, it2, it3;
    it1 = it2 = it3 = it;
    --it1; ++it3;
    
    if(it2 != v.begin() && it3 != v.end())
    {
        diff.insert((*it3) - (*it1));
    }
    if(it2 != v.begin())
    {
        diff.erase(diff.find((*it2) - (*it1)));
    }
    if(it3 != v.end())
    {
        diff.erase(diff.find((*it3) - (*it2)));
    }
    
    v.erase(it);
    return 0;
}

bool zeap::find(int x)
{
    return v.find(x) != v.end();
}

int zeap::max_dif()
{
    return v.size() < 2 ? -1 : ((*v.rbegin()) - (*v.begin()));
}

int zeap::min_dif()
{
    return v.size() < 2 ? -1 : *diff.begin();
}