Cod sursa(job #1194824)

Utilizator Aleks10FMI - Petrache Alex Aleks10 Data 4 iunie 2014 21:18:46
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
//
//  main.cpp
//  zeap
//
//  Created by Alex Petrache on 04/06/14.
//  Copyright (c) 2014 Alex Petrache. All rights reserved.
//

#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;
set<int> hp;
multiset<int> Q;
void del(int val){
    set<int>::iterator it,it1,it2;
    multiset<int>::iterator a1,a2;
    it=hp.find(val);
    if (it==hp.end()){
        printf("-1\n");
        return;
    }
    it1=it;
    if (it1!=hp.begin())
        --it1;
    it2=it;
    ++it2;
    if (it1!=it)
        Q.erase(Q.find(abs(val-*it1)));
    if (it2!=hp.end())
        Q.erase(Q.find(abs(*it2-val)));
    if (it2!=hp.end() && it1!=it)
        Q.insert(*it2-*it1);
    hp.erase(*it);
}
void insert(int val){
    set<int>::iterator i1,i2,it;
    if (hp.size()==0){
        hp.insert(val);
        return;
    }
    i2 = hp.lower_bound(val);
    if (*i2 == val)
        return;
    i1 = i2;
    if (i1!=hp.begin())
        --i1;
    if (i2!=hp.end())
        Q.insert(abs(*i2-val));
    if (i1!=i2)
        Q.insert(abs(*i1-val));
    hp.insert(val);
}
void search(int val){
    set<int>::iterator it;
    it=hp.find(val);
    it==hp.end()?printf("0\n"):printf("1\n");
}
void MAX(){
    set<int>::iterator it,it2;
    if (hp.size()<2){
        printf("-1\n");
        return;
    }
    it=hp.end();--it;
    it2=hp.begin();
    printf("%d\n",*it-*(hp.begin()));
}
void MIN(){
    set<int>::iterator it1,it2;
    if (hp.size()<2){
        printf("-1\n");
        return;
    }
    printf("%d\n",*(Q.begin()));
}
int main(){
    char s[30],type;
    int val,i;
  //  freopen("zeap.in","r",stdin);
//    freopen("zeap.out","w",stdout);
    freopen("/Users/alexpetrache/Documents/Programare/Xcode/zeap/zeap/zeap.in","r",stdin);
    freopen("/Users/alexpetrache/Documents/Programare/Xcode/zeap/zeap/zeap.out","w",stdout);

    while (gets(s)){
        if (strcmp(s,"MAX")==0)
            MAX();
        else
            if (strcmp(s,"MIN")==0)
                MIN();
            else{
                type=s[0];val=0;
                for (i=2;s[i]>='0' && s[i]<='9';++i)
                    val=val*10+s[i]-'0';
                if (type=='I')
                    insert(val);
                else
                    if (type=='S')
                        del(val);
                    else
                        search(val);
            }
    }
}