Cod sursa(job #1770658)

Utilizator Bodo171Bogdan Pop Bodo171 Data 4 octombrie 2016 18:15:03
Problema Zeap Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <iostream>
#include<fstream>
#include<string>
#include<algorithm>
#include<cassert>
using namespace std;
ifstream f("zeap.in");
ofstream g("zeap.out");
string str;
struct node
{
    int mx,mn,mindif;
}arb[2000005];
int v[300005],value,val,i,j,n,q,par[300005],num,newn,vallm;
int op[300005];
bool cauta;
int minn(int x,int y)
{
    if(x<=0) return y;
    if(y<=0) return x;
    if(x<y) return x;
    return y;
}
void update(int nod,int l,int r)
{
    if(l==r)
    {
        if(value!=v[l])
        {
            if(cauta==1) g<<"0\n";
            else g<<"-1\n";
            return;
        }
        if(cauta==1)
        {
        if(arb[nod].mn!=0)g<<"1\n";
        else g<<"0\n";
        return;
        }
        if(arb[nod].mn==0&&val==0) {g<<"-1\n";return;}
        arb[nod].mn=val;
        arb[nod].mx=val;
        return;
    }
    int m=(l+r)/2;
    if(value<=v[m]) update(2*nod,l,m);
    else update(2*nod+1,m+1,r);
    if(cauta==0)
    {
    arb[nod].mx=max(arb[2*nod].mx,arb[2*nod+1].mx);
    arb[nod].mn=minn(arb[2*nod].mn,arb[2*nod+1].mn);
    if(arb[2*nod].mx==0) vallm=0;
    else vallm=arb[2*nod+1].mn-arb[2*nod].mx;
    arb[nod].mindif=minn(minn(arb[2*nod].mindif,arb[2*nod+1].mindif),vallm);
    }
}
int main()
{
    while(getline(f,str))
    {
        q++;
        if(str[0]=='M')
        {
            if(str[1]=='A') op[q]=1;
            else op[q]=2;
        }
        else
        {
            num=0;
            for(j=2;j<str.size();j++)
                if(str[j]>='0'&&str[j]<='9')
                  num=num*10+str[j]-'0';
            par[q]=num;
            if(str[0]=='C') op[q]=3;
            if(str[0]=='S') op[q]=4;
            if(str[0]=='I') {op[q]=5;n++;v[n]=num;}
        }
    }
    sort(v+1,v+n+1);
    for(i=1;i<=n;i++)
    {
        if(v[i]!=v[i-1])
        {
            newn++;
            v[newn]=v[i];
        }
    }
    n=newn;
    cauta=0;
    for(i=1;i<=q;i++)
    {
        if(op[i]==1)
        {
            val=arb[1].mx-arb[1].mn;
            if(arb[1].mx==0||arb[1].mx==arb[1].mn) val=-1;
            g<<val<<'\n';
            continue;
        }
        if(op[i]==2)
        {
            val=arb[1].mindif;
            if(val==0) val=-1;
            g<<val<<'\n';
            continue;
        }
        if(op[i]==3)
        {
            cauta=1;
            value=par[i];
            val=0;
            update(1,1,n);
            cauta=0;
            continue;
        }
        if(op[i]==4)
        {
            value=par[i];
            val=0;
            update(1,1,n);
            continue;
        }
        val=par[i];value=par[i];
        update(1,1,n);
    }
    return 0;
}