Cod sursa(job #1194172)

Utilizator buzu.tudor67Tudor Buzu buzu.tudor67 Data 3 iunie 2014 01:28:21
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<fstream>
#include<string>
#include<set>
using namespace std;
ifstream fi("zeap.in");
ofstream fo("zeap.out");

const int inf = (1LL<<31)-1;

multiset <int> m_set;
set <int>::iterator it;
set <int> s;
string sir;

void inserare(){
     int x,a,b;
     
     fi>>x;
     if(s.count(x)==0){
                       s.insert(x);
                       it=s.find(x);
                       it--;
                       a=*it;
                       it++;
                       it++;
                       b=*it;
                       
                       if(a>0) m_set.insert(x-a);
                       if(b<inf) m_set.insert(b-x);
                       if(a>0 && b<inf) m_set.insert(b-a);
                      }
}

void stergere(){
     int x,a,b;
     
     fi>>x;
     if(s.count(x)!=0){
                       it=s.find(x);
                       it--;
                       a=*it;
                       it++;
                       it++;
                       b=*it;
                       it--;
                       
                       if(a>0) m_set.erase(m_set.find(x-a));
                       if(b<inf) m_set.erase(m_set.find(b-x));
                       if(a>0 && b<inf) m_set.insert(b-a);
                       
                       s.erase(it);
                      }
     else fo<<"-1\n";
}

void cautare(){
     int x;
     
     fi>>x;
     if(s.count(x)!=0) fo<<"1\n";
     else fo<<"0\n";
}

void max_dif(){
     int a,b;
     
     if(s.size()<=3) fo<<"-1\n";
     else{
          it=s.end();
          it--;
          it--;
          a=*it;
          it=s.begin();
          it++;
          b=*it;
          
          fo<<a-b<<"\n";
         }
}

void min_dif(){
     if(s.size()<=3) fo<<"-1\n";
     else fo<<*(m_set.begin())<<"\n";
}

int main(){
    s.insert(0);
    s.insert(inf);
    
    while(fi>>sir){
                   if(sir=="I") inserare();
                   else if(sir=="S") stergere();
                   else if(sir=="C") cautare();
                   else if(sir=="MAX") max_dif();
                   else if(sir=="MIN") min_dif();
                  }
    
    fi.close();
    fo.close();
    return 0;
}