Cod sursa(job #1470793)

Utilizator Liviu98Dinca Liviu Liviu98 Data 12 august 2015 12:27:45
Problema Zeap Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 4 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 NMax 300005
#define MOD 3000013
#define INFINIT 99999999999
using namespace std;

struct Query
{
    int type;
    int val;
    int key;
} Q[NMax],sorted[NMax];

struct Arbore
{
    int minn;
    int maxx;
    int diff;
} Arb[1<<21];
char s[20];
int ind,nr,nrs,nri;
int poz[NMax];
bool inside[NMax];
vector < pair<int,int> > norm[MOD];

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

int normalize(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,normalize(valc));
            sorted[++nrs]=Q[nr];
            continue;
        }
        if(s[0]=='S')
            {nr++; valc=number(); add(2,valc,normalize(valc)); continue;}
        if(s[0]=='C')
            {nr++; valc=number(); add(3,valc,normalize(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(Query x,Query y)
{
    return x.val<y.val;
}

void build(int nod,int left,int right)
{
    Arb[nod].minn=INFINIT; Arb[nod].maxx=-INFINIT; Arb[nod].diff=INFINIT;
    if(left==right)
        return;
    int mid=(left+right)/2;
    build(2*nod,left,mid);build(2*nod+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++)
        poz[sorted[i].key]=i;

    build(1,1,nri);
}

void update(int nod,int left,int right,int pozz,int value)
{
    if(left==right)
    {
        Arb[nod].minn=value;
        Arb[nod].maxx=value;
        if(!value) {
                Arb[nod].minn=INFINIT;
                Arb[nod].maxx=-INFINIT;
                   }
        return ;
    }

    int mid=(left+right)/2;
    if(pozz<=mid)
        update(2*nod,left,mid,pozz,value);
    else
        update(2*nod+1,mid+1,right,pozz,value);

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

void solve()
{
    for(int i=1;i<=nr;i++)
    {
        if(Q[i].type==1)
        {
            if(!inside[Q[i].key])
                update(1,1,nri,poz[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,poz[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(Arb[1].minn>=Arb[1].maxx) printf("-1\n");
            else printf("%d\n",Arb[1].maxx-Arb[1].minn);
            continue;
        }
        if(Q[i].type==5)
        {
            if(Arb[1].minn>=Arb[1].maxx) printf("-1\n");
            else printf("%d\n",Arb[1].diff);
        }
    }
}

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