Cod sursa(job #414702)

Utilizator vladiiIonescu Vlad vladii Data 10 martie 2010 13:22:56
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.75 kb
#include <iostream>
#include <set>
using namespace std;

set<int> S;
set<int>::iterator it, it1, it2, it5, it6;
pair<set<int>::iterator,bool> ret;
multiset<int> D;
multiset<int>::iterator it3, it4;
char op[20];

int main() {
    FILE *f1=fopen("zeap.in", "r"), *f2=fopen("zeap.out", "w");
    int i, j, p, q, nr;
    fgets (op, 20, f1);
    while(!feof(f1)) {
         p=0; nr=0;
		 while ((op[p] < '0' || op[p] > '9') && op[p] != '\n') p++;
		 while (op[p] >= '0' && op[p] <= '9') { 
			  nr=nr*10+op[p]-'0'; 
              p++;
         }
         p=nr;
         if(op[0]=='I') {
              it6=S.lower_bound(p);
              if((*it6)!=p) {
                   it=it6;
                   if(S.size()>=1) {
                        if(it==S.begin()) {
                             D.insert(abs(p-*it));
                        }
                        else if(it==S.end()) {
                             it--;
                             D.insert(abs(p-*it));
                        }
                        else {
                             it1=it; it1--;
                             it2=it; it2++;
                             D.erase(D.find(abs(*it1-*it2)));
                             D.insert(abs(p-*it1));
                             D.insert(abs(p-*it2));
                        }
                   }
                   else if(S.size()==0) { /**do nothing;**/ }
                   S.insert(p);
              }
         }
         else if(op[0]=='S') {
              it=S.find(p);
              if(it==S.end()) {
                   fprintf(f2, "%d\n", -1);
              }
              else {
                   it5=S.end(); it5--;
                   if(S.size()==1) { S.erase(it); }
                   else if(it==S.begin()) {
                        it1=it; it1++;
                        if(D.size()) {
                             it4=D.find(abs(*it-*it1)); 
                             if(it4!=D.end()) { D.erase(abs(*it-*it1)); }
                        }
                        S.erase(it);
                   }
                   else if(it==it5) {
                        it1=it5; it1--;
                        if(D.size()) { 
                             it4=D.find(abs(*it-*it1)); 
                             if(it4!=D.end()) { D.erase(abs(*it-*it1)); }
                        }
                        S.erase(it);
                   }
                   else {
                        it1=it; it1--;
                        it2=it; it2++;
                        D.insert(abs((*it2)-(*it1)));
                        it3=D.find(abs((*it)-(*it1)));
                        if(it3!=D.end()) { D.erase(it3); }
                        it4=D.find(abs((*it)-(*it2)));
                        if(it4!=D.end()) { D.erase(it4); }
                        S.erase(it);
                   }
              }
         }
         else if(op[0]=='C') {
              it=S.find(p);
              if(it==S.end()) {
                   fprintf(f2, "%d\n", 0);
              }
              else {
                   fprintf(f2, "%d\n", 1);
              }
         }
         else if(op[0]=='M' && op[1]=='A') {
              if(S.size()<2) {
                   fprintf(f2, "%d\n", -1);
              }
              else {
                   it1=S.end(); it1--;
                   it2=S.begin();
                   fprintf(f2, "%d\n", (*it1)-(*it2));
              }
         }
         else if(op[0]=='M' && op[1]=='I') {
              if(S.size()<2) {
                   fprintf(f2, "%d\n", -1);
              }
              else {
                   fprintf(f2, "%d\n", (*D.begin()));
              }
         }
         fgets (op, 20, f1);
    }
    fclose(f1); fclose(f2);
    return 0;
}