Cod sursa(job #2669682)

Utilizator hhhhhhhAndrei Boaca hhhhhhh Data 7 noiembrie 2020 16:15:37
Problema Zeap Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.17 kb
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))
//#pragma GCC optimize("O3")
using namespace std;
using namespace __gnu_pbds;
auto random_address = [] { char *p = new char; delete p; return uint64_t(p); };
const uint64_t SEED = chrono::steady_clock::now().time_since_epoch().count() * (random_address() | 1);
mt19937_64 rng(SEED);
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
string str;
multiset<ll> difs;
set<ll> s;
const ll INF=1000000000000000000;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    while(fin>>str)
    {
        if(str=="I")
        {
            ll nr;
            fin>>nr;
            if(s.find(nr)==s.end())
            {
                s.insert(nr);
                auto it=s.find(nr);
                ll prev=INF,nxt=INF;
                if(it!=s.begin())
                {
                    it--;
                    prev=*it;
                }
                it=s.find(nr);
                it++;
                if(it!=s.end())
                    nxt=*it;
                if(prev!=INF&&nxt!=INF)
                    difs.erase(difs.find(nxt-prev));
                if(prev!=INF)
                    difs.insert(nr-prev);
                if(nxt!=INF)
                    difs.insert(nxt-nr);
            }
        }
        if(str=="S")
        {
            ll nr;
            fin>>nr;
            if(s.find(nr)==s.end())
            {
                fout<<-1<<'\n';
                continue;
            }
            auto it=s.find(nr);
            ll prev=INF,nxt=INF;
            if(it!=s.begin())
            {
                it--;
                prev=*it;
            }
            it=s.find(nr);
            it++;
            if(it!=s.end())
                nxt=*it;
            if(prev!=INF&&nxt!=INF)
                difs.insert(nxt-prev);
            if(prev!=INF)
                difs.erase(difs.find(nr-prev));
            if(nxt!=INF)
                difs.erase(difs.find(nxt-nr));
        }
        if(str=="C")
        {
            ll nr;
            fin>>nr;
            if(s.find(nr)==s.end())
                fout<<0<<'\n';
            else
                fout<<1<<'\n';
        }
        if(str=="MAX")
        {
            if(s.size()<=1)
            {
                fout<<-1<<'\n';
                continue;
            }
            ll nr1=*s.begin();
            auto it=s.end();
            it--;
            ll nr2=*it;
            fout<<nr2-nr1<<'\n';
        }
        if(str=="MIN")
        {
            if(s.size()<=1)
            {
                cout<<-1<<'\n';
                continue;
            }
            fout<<*difs.begin()<<'\n';
        }
    }
    return 0;
}