Cod sursa(job #1470798)

Utilizator Liviu98Dinca Liviu Liviu98 Data 12 august 2015 12:37:28
Problema Zeap Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Semestrul 2 Marime 4.02 kb
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<vector>
#define pb push_back
#define mp make_pair
#define v first
#define index second
#define maxn 300005
#define mod 3000013
#define aitmax 1<<21
#define inf 0x3f3f3f3f
using namespace std;

struct question
{
    int type,val,key;
}q[maxn],sorted[maxn];
struct segment_tree
{
    int minn,maxx,diff;
} ait[aitmax];
char s[20];
int ind,nr,nrs,nri;
int pos[maxn];
bool inside[maxn];
vector < pair<int,int> > norm[mod];

int HashKey(int k)
{
    return k%mod;
}

int Normalizare(int val)
{
    int k=HashKey(val);
    for(unsigned int i=0;i<norm[k].size();i++)
        if(norm[k][i].v==val)
        return norm[k][i].index;

    norm[k].pb(mp(val,++ind));
    return ind;
}

int number()
{
    int val=0;
    for(int i=2;s[i]>='0' && s[i]<='9';i++)
    val=val*10+s[i]-'0';
    return val;
}

void add(int t,int num,int k)
{
    q[nr].type=t;q[nr].val=num;q[nr].key=k;
}

void read()
{
    int valc;
    while(!feof(stdin))
    {
        memset(s,'n',sizeof(s));
        fgets(s,sizeof(s),stdin);
        if(s[0]=='I')
        {
            nr++; valc=number(); add(1,valc,Normalizare(valc));
            sorted[++nrs]=q[nr];
            continue;
        }
        if(s[0]=='S')
            {nr++; valc=number(); add(2,valc,Normalizare(valc)); continue;}
        if(s[0]=='C')
            {nr++; valc=number(); add(3,valc,Normalizare(valc)); continue;}
        if(s[0]=='M' && s[1]=='A')
            {q[++nr].type=4; continue;}
        if(s[0]=='M' && s[1]=='I')
            {q[++nr].type=5; continue;}
        scanf("\n");
    }
}

int comp(question i,question j)
{
    return i.val<j.val;
}

void Build(int k,int left,int right)
{
    ait[k].minn=inf;
    ait[k].maxx=-inf;
    ait[k].diff=inf;
    if(left==right)
        return;
    int mid=(left+right)/2;
    Build(2*k,left,mid);Build(2*k+1,mid+1,right);
}

void Initializare()
{
    int i;
    sort(sorted+1,sorted+nrs+1,comp);
    sorted[0].val=-1;
    for(i=1;i<=nrs;i++)
        if(sorted[i].val!=sorted[i-1].val)
        sorted[++nri]=sorted[i];

    for(i=1;i<=nri;i++)
    pos[sorted[i].key]=i;
    Build(1,1,nri);
}

void Update(int k,int left,int right,int poss,int value)
{
    if(left==right)
    {
        ait[k].minn=value;
        ait[k].maxx=value;
        if(!value) {ait[k].minn=inf;
                    ait[k].maxx=-inf;}
        return ;
    }

    int mid=(left+right)/2;
    if(poss<=mid)
        Update(2*k,left,mid,poss,value);
    else
        Update(2*k+1,mid+1,right,poss,value);

    ait[k].minn=min(ait[2*k].minn,ait[2*k+1].minn);
    ait[k].maxx=max(ait[2*k].maxx,ait[2*k+1].maxx);
    ait[k].diff=min(ait[2*k].diff,ait[2*k+1].diff);
    ait[k].diff=min(ait[k].diff,ait[2*k+1].minn-ait[2*k].maxx);
}

void Solve()
{
    for(int i=1;i<=nr;i++)
    {
        if(q[i].type==1)
        {
            if(!inside[q[i].key])
                Update(1,1,nri,pos[q[i].key],q[i].val);
                inside[q[i].key]=true;
                continue;
        }
        if(q[i].type==2)
        {
            if(!inside[q[i].key])
                printf("-1\n");
            else
                Update(1,1,nri,pos[q[i].key],0),inside[q[i].key]=false;
            continue;
        }
        if(q[i].type==3)
        {
            if(inside[q[i].key])
                printf("1\n");
            else
                printf("0\n");
            continue;
        }
        if(q[i].type==4)
        {
            if(ait[1].minn>=ait[1].maxx)
                 printf("-1\n");
            else
                 printf("%d\n",ait[1].maxx-ait[1].minn);
            continue;
        }
        if(q[i].type==5)
        {
            if(ait[1].minn>=ait[1].maxx)
                printf("-1\n");
            else
                printf("%d\n",ait[1].diff);
        }
    }
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    read();
    Initializare();
    Solve();
}