Cod sursa(job #1153412)

Utilizator the@EyE@Postavaru Stefan the@EyE@ Data 25 martie 2014 14:14:04
Problema Zeap Scor 40
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 2.13 kb
#include<stdio.h>
#include<set>
#include<string.h>
#define MOD1 666019
#define MOD2 12343

using namespace std;

int nr=0;
set<int> hash[MOD1];
set<int> tree;
multiset<int> dif;
set<int>::iterator treeIt,treeIt2,treeIt3;
char cmd[20];

inline bool find(int x)
{
    return hash[x%MOD1].find(x%MOD2)!=hash[x%MOD1].end();
}

inline int getNr()
{
    int l=strlen(cmd);
    int ret=0;
    for(int i=2;i<l;++i)
        ret=ret*10+cmd[i]-48;
    return ret;
}

inline void ins()
{
    int x=getNr();
    if(find(x))return;
    ++nr;
    hash[x%MOD1].insert(x%MOD2);
    treeIt=tree.insert(x).first;
    int ok=0;
    if(treeIt!=tree.begin())
    {
        treeIt2=treeIt;
        treeIt2--;
        dif.insert((*treeIt)-(*treeIt2));
        ok++;
    }
    treeIt3=treeIt;
    treeIt3++;
    if(treeIt3!=tree.end()){dif.insert((*treeIt3)-(*treeIt));ok++;}
    if(ok==2)dif.erase(dif.find((*treeIt3)-(*treeIt2)));
}

inline int del()
{
    int x=getNr();
    if(nr==0||!find(x))return -1;
    --nr;
    hash[x%MOD1].erase(x%MOD2);
    treeIt=tree.find(x);
    int ok=0;
    if(treeIt!=tree.begin())
    {
        treeIt2=treeIt;
        treeIt2--;
        dif.erase((*treeIt)-(*treeIt2));
        ok++;
    }
    treeIt3=treeIt;
    treeIt3++;
    if(treeIt3!=tree.end()){dif.erase((*treeIt3)-(*treeIt));ok++;}
    if(ok==2)dif.insert((*treeIt3)-(*treeIt2));
    tree.erase(x);
    return 0;
}

inline bool src()
{
    int x=getNr();
    if(nr==0||!find(x))return 0;
    return 1;
}

inline int mx()
{
    if(nr<2)return -1;
    treeIt3=tree.end();
    treeIt3--;
    return (*treeIt3)-(*tree.begin());
}

inline int mn()
{
    if(nr<2)return -1;
    return *dif.begin();
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    gets(cmd);
    while(!feof(stdin))
    {
        if(cmd[0]=='I')ins();
        else if(cmd[0]=='S'){int res=del();if(res==-1)printf("-1\n");}
        else if(cmd[0]=='C')printf("%d\n",src());
        else if(cmd[1]=='A')printf("%d\n",mx());
        else printf("%d\n",mn());
        gets(cmd);
    }
    return 0;
}