Cod sursa(job #1310217)

Utilizator AeroHHorea Stefan AeroH Data 6 ianuarie 2015 16:35:18
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.58 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <queue>
#include <set>
#include <map>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <numeric>
#define ll long long int
#define punct pair<ll,ll>
#define MOD 10000007
using namespace std;
int x,t1,t2;
pair<int,int> pa;
ifstream f("zeap.in");
ofstream g("zeap.out");
int main()
{
    ios_base::sync_with_stdio(false);

    string s;
    map<int,int> M,dif;
    map<int,int>::iterator it,itt;
    map<int,set<int> > mem;
    set<int> v;

    while(f>>s)
        {
            if (s == "I")
                {
                    f>>x;

                    M[x]=1;
                    it=M.find(x);

                    if (it != M.begin() && it != M.end())
                        {

                            ++it;
                            if (it != M.end())
                                {
                                    dif[abs(x-it->first)]++;
                                    mem[x].insert(it->first);
                                    mem[it->first].insert(x);
                                }
                            --it;--it;
                            if (it->first >= M.begin()->first)
                                {
                                    dif[abs(x-it->first)]++;
                                    mem[x].insert(it->first);
                                    mem[it->first].insert(x);
                                }

                        }
                }
            else if (s == "S")
                {
                    f>>x;
                    if (!M[x])
                        {g<<-1<<'\n';continue;}

                    M.erase(x);
                    v=mem[x];
                    for (set<int>::iterator it=v.begin();it!=v.end();++it)
                        {
                            dif[abs(*it-x)]--;
                            mem[*it].erase(x);
                            if (it != v.begin() && v.size() > 1)
                                {
                                    ++dif[abs(*it- *--it)];
                                    mem[*it].insert(*++it);
                                    mem[*it].insert(*--it);
                                    ++it;
                                }
                        }
                    mem[x].clear();



                    mem.erase(x);

                }
            else if (s == "C")
                {
                    f>>x;
                    if(M[x])
                        g<<1<<'\n';
                    else g<<0<<'\n';
                }
            else if (s == "MAX")
                {
                    if (M.size()<2)
                        {
                            g<<-1<<'\n';
                            continue;
                        }
                    it=M.begin();
                    itt=M.end();
                    --itt;
                    if (it!=itt )
                        g<<abs(it->first-itt->first)<<'\n';
                }
            else if (s == "MIN")
                {
                    it=dif.begin();
                    while(!it->second)
                        {
                            dif.erase(it);
                            it=dif.begin();
                        }
                        if (dif.begin()!=dif.end())
                            g<<dif.begin()->first<<'\n';
                        else g<<-1<<'\n';
                }

        }

    return 0;
}