Cod sursa(job #221817)

Utilizator CezarMocanCezar Mocan CezarMocan Data 18 noiembrie 2008 11:25:10
Problema Zeap Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 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;

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);     
  //      printf("BAG %d\n", dif2);  
        x.insert(dif2); 
    }
    if (it1 != it2) {
        dif1 = abs(*it1 - nr);            
//        printf("BAG %d\n", dif1);          
        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));
    //    printf("SCOT %d\n", *it2 - nr);          
    }
    if (it1 != it) {
        x.erase(x.find(nr - *it1));
  //      printf("SCOT %d\n", nr - *it1);                  
    }
    
    if (it2 != v.end() && it1 != it) {
        x.insert(*it2 - *it1);    
//        printf("BAG %d\n", *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());    
}





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