Cod sursa(job #2454689)

Utilizator StanCatalinStanCatalin StanCatalin Data 9 septembrie 2019 18:02:42
Problema Zeap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.66 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int dim = 300011;
const int INF = 1000000005;

struct todo
{
    int tip;
    int cand;
    int val;
    int cate;
};

struct aint
{
    int mini,maxi,diff;
};

aint arb[4*dim];
int n,capat;
char t[5];
todo q[dim];

bool cmp_1(todo a,todo b)
{
    if (a.tip > 2)
    {
        return false;
    }
    if (b.tip > 2)
    {
        return true;
    }
    return a.val < b.val;
}

bool cmp_2(todo a,todo b)
{
    return a.cand < b.cand;
}

void build(int nod,int st,int dr)
{
    arb[nod].maxi = -INF;
    arb[nod].mini = INF;
    arb[nod].diff = INF;
    if (st == dr)
    {
        return ;
    }
    int mid = (st+dr)/2;
    build(2*nod, st,mid);
    build(2*nod+1,mid+1,dr);
}

void update(int nod,int st,int dr,int index,int val)
{
    if (st == dr)
    {
        if (val == 0)
        {
            arb[nod].maxi = -INF;
            arb[nod].mini = INF;
        }
        else
        {
            arb[nod].maxi = arb[nod].mini = val;
        }
        return ;
    }

    int mid = (st+dr)/2;
    if (index <= mid)
    {
        update(2*nod , st, mid , index,val);
    }
    else update(2*nod+1,mid+1,dr,index,val);

    arb[nod].mini = min(arb[2*nod].mini , arb[2*nod+1].mini);
    arb[nod].maxi = max(arb[2*nod].maxi , arb[2*nod+1].maxi);
    arb[nod].diff = min(min(arb[2*nod].diff , arb[2*nod+1].diff) , arb[2*nod+1].mini - arb[2*nod].maxi);
}

int query(int nod,int st,int dr,int index)
{
    if (st == dr)
    {
        return (arb[nod].maxi == arb[nod].mini);
    }
    int mid = (st+dr)/2;
    if (index <= mid)
    {
        return query(2*nod,st,mid,index);
    }
    else return query(2*nod+1,mid+1,dr,index);
}

int main()
{
    while (in >> t)
    {
        n++;
        q[n].cand = n;
        if (t[0] == 'I')
        {
            q[n].tip = 0;
            in >> q[n].val;
        }
        if (t[0] == 'S')
        {
            q[n].tip = 1;
            in >> q[n].val;
        }
        if (t[0] == 'C')
        {
            q[n].tip = 2;
            in >> q[n].val;
        }
        if (t[0] == 'M')
        {
            if (t[1] == 'A')
            {
                q[n].tip = 3;
            }
            if (t[1] == 'I')
            {
                q[n].tip = 4;
            }
        }
    }
    sort(q+1,q+n+1 , cmp_1);
    q[1].cate = 1;
    for (int i=1; i<=n && q[i].tip <= 2; i++)
    {
        if (q[i].val > q[i-1].val)
        {
            q[i].cate = q[i-1].cate + 1;
        }
        else q[i].cate = q[i-1].cate;
        capat = max(capat , q[i].cate);
    }
    sort(q+1,q+n+1,cmp_2);
    build(1,1,capat);

    for (int i=1; i<=n; i++)
    {
        if (q[i].tip == 0)
        {
            update(1,1,capat,q[i].cate , q[i].val);
        }
        if (q[i].tip == 1)
        {
            if (query(1,1,capat,q[i].cate) == 0)
            {
                out << "-1\n";
            }
            else update(1,1,capat,q[i].cate,0);
        }
        if (q[i].tip == 2)
        {
            out << query(1,1,capat,q[i].cate) << "\n";
        }
        if (q[i].tip == 3)
        {
            if (arb[1].maxi > arb[1].mini)
            {
                out << arb[1].maxi - arb[1].mini << "\n";
            }
            else out << "-1\n";
        }
        if (q[i].tip == 4)
        {
            if (arb[1].maxi > arb[1].mini)
            {
                out << arb[1].diff << "\n";
            }
            else out << "-1\n";
        }
    }
    return 0;
}