Cod sursa(job #1328562)

Utilizator AeroHHorea Stefan AeroH Data 28 ianuarie 2015 15:37:00
Problema Zeap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.72 kb
#include <fstream>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;

ifstream f("zeap.in");
ofstream g("zeap.out");

int x,st,dr,val;

map<int,map<int,int> > m;
map<int,int> dif;
map<int,int> caut;
map<int,int>::iterator it;

void differ(int val,int x)
    {

        map<int,int>::iterator itt=caut.lower_bound(val);

        if(itt!=caut.end())
        {
        ++itt;
        if (itt!=caut.end())
        {
        st=itt->first;

        ++dif[abs(st-val)];
        m[val][st]++;
        m[st][val]++;
        }
        }

    }

int main()
{

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

                    it=caut.lower_bound(x);
                    if (it->first == x)
                        continue;

                    ++caut[x];

                    if (it!=caut.end() && it->first != x)
                        {
                            dr=it->second;
                            ++dif[abs(dr-x)];
                            m[x][dr]++;
                            m[dr][x]++;
                        }
                    --it;
                    --it;
                    if (it->first != x)
                        {
                            st=it->first;
                            ++dif[abs(st-x)];
                            m[x][st]++;
                            m[st][x]++;
                        }

                }
            else if (s == "S")
                {
                    f>>x;
                    if (caut[x])
                    {


                    /*g<<"***********************************\n";
                    for(it=caut.begin();it!=caut.end();++it)
                        g<<it->first<<" ";
                    g<<'\n';*/
                    --caut[x];
                    if (caut[x]==0)
                        caut.erase(x);

                    for (it=m[x].begin();it!=m[x].end();++it)
                        {
                            val=it->first;
                            differ(val,x);

                            --dif[abs(val-x)];
                            if (dif[abs(val-x)]==0)
                                dif.erase(abs(val-x));

                            --m[val][x];
                            if (m[val][x] == 0)
                                m[val].erase(x);

                        }
                    m[x].clear();
                   /* for(it=dif.begin();it!=dif.end();++it)
                        g<<it->first<<" ";
                    g<<'\n';
                    g<<"***********************************\n";*/
                    }
                    else
                    {
                        g<<-1<<'\n';
                        caut.erase(x);
                    }
                }
            else if (s == "C"){
                    f>>x;
                    if (caut[x])
                        g<<1<<'\n';
                    else
                    {
                        g<<0<<'\n';
                        caut.erase(x);
                    }

                }
            else if (s == "MIN")
                {
                    it=dif.begin();
                    g<<it->first<<'\n';
                }
            else if (s == "MAX")
                {
                    it=caut.end();
                    --it;
                    g<<it->first-caut.begin()->first<<'\n';
                }

           // g<<"***********************************  ";
           // for(it=dif.begin();it!=dif.end();++it)
           //         g<<it->first<<" "<<it->second<<" ";
           // g<<'\n';
        }
    return 0;
}