Cod sursa(job #935467)

Utilizator rudarelLup Ionut rudarel Data 3 aprilie 2013 15:11:49
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <set>
#include <cstring>
#include <algorithm>
#define oo 1000100000
using namespace std;
set<int> S;
multiset<int> Q;
void del(int val){
    set<int>::iterator it,it1,it2;
    multiset<int>::iterator a1,a2;
    it=S.find(val);
    if (it==S.end()){
        printf("-1\n");
        return;
    }
    it1=it;
    if (it1!=S.begin())
        --it1;
    it2=it;
    ++it2;
    if (it1!=it)
        Q.erase(Q.find(abs(val-*it1)));
    if (it2!=S.end())
        Q.erase(Q.find(abs(*it2-val)));
    if (it2!=S.end() && it1!=it)
        Q.insert(*it2-*it1);
    S.erase(*it);
}
void insert(int val){
    set<int>::iterator i1,i2,it;
    if (S.size()==0){
        S.insert(val);
        return;
    }
    i2 = S.lower_bound(val); 
    if (*i2 == val) 
        return; 
    i1 = i2; 
    if (i1!=S.begin()) 
        --i1; 
    if (i2!=S.end())
        Q.insert(abs(*i2-val));  
    if (i1!=i2)
        Q.insert(abs(*i1-val)); 
    S.insert(val); 
}
void search(int val){
    set<int>::iterator it;
    it=S.find(val);
    it==S.end()?printf("0\n"):printf("1\n");
}
void MAX(){
    set<int>::iterator it,it2;
    if (S.size()<2){
        printf("-1\n");
        return;
    }
    it=S.end();--it;
    it2=S.begin();//printf("MAX %d %d\n",*it2,*it);
    printf("%d\n",*it-*(S.begin()));
}
void MIN(){
    set<int>::iterator it1,it2;
    if (S.size()<2){
        printf("-1\n");
        return;
    }
    printf("%d\n",*(Q.begin()));
}
main(){
    char s[30],type;
    int val,i;
    freopen("zeap.in","r",stdin);
    freopen("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);
            }
    }
}