Cod sursa(job #221825)

Utilizator CezarMocanCezar Mocan CezarMocan Data 18 noiembrie 2008 11:46:00
Problema Zeap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <set>
#include <cstdio>

using namespace std;

set <int> v;
multiset <int> x;
set <int>::iterator it, it1, it2;

int n, i, j, m, nr;
char c[20];

void zeap_insert(int nr) {
    int d, dif1, dif2, nr1, nr2, d1, d2;
    pair <int, int> p1, p2;
    if (v.size() == 0) {
        v.insert(nr);   
        return;
    }
    it2 = v.lower_bound(nr);
    if (*it2 == nr)
        return;
        
    it1 = it2;
    if (it1 != v.begin())
        --it1;
        
    if (it2 != v.end()) {
        dif2 = abs(*it2 - nr);     
        x.insert(dif2); 
    }
    if (it1 != it2) {
        dif1 = abs(*it1 - nr);            
        x.insert(dif1);
    }
    v.insert(nr);
}

int zeap_delete(int nr) {
    int d;
    it = v.find(nr);    
    if (it == v.end()) 
        return -1;    
    
    it1 = it; 
    if (it1 != v.begin())
        --it1;
    it2 = it; ++it2;
    
    if (it2 != v.end()) {
        x.erase(x.find(*it2 - nr));
    }
    if (it1 != it) {
        x.erase(x.find(nr - *it1));
    }
    
    if (it2 != v.end() && it1 != it) {
        x.insert(*it2 - *it1);    
    }
    
    v.erase(it);
    
    return 0;
}


int zeap_search(int nr) {
    if (v.find(nr) == v.end())    
        return 0;
    else
        return 1;
}

int zeap_max() {
    if (v.size() < 2)
        return -1;
    it = v.end(); --it;
        
    return (*it - (*v.begin()));    
}

int zeap_min() {
    if (v.size() < 2)
        return -1;
    return (*x.begin());    
}


void baloteaza() {
    int i;
    nr = 0;
    for (i = 2; c[i] != 0; i++)
        nr = nr * 10 + (c[i] - 48);    
}


int main() {
    freopen("zeap.in", "r", stdin);
    freopen("zeap.out", "w", stdout);    
    
    while (gets(c)) {
        
        if (c[0] == 'I') {
            baloteaza();
            zeap_insert(nr);    
        }
        
        if (c[0] == 'S') {
            baloteaza();
            if (zeap_delete(nr) == -1)
                printf("-1\n");   
        }
        
        if (c[0] == 'C') {
            baloteaza();
            printf("%d\n", zeap_search(nr));    
        }
        
        if (c[0] == 'M') {
            if (c[2] == 'X')
                printf("%d\n", zeap_max());
            else
                printf("%d\n", zeap_min());   
        }
    }
    
    return 0;
}