Cod sursa(job #977078)

Utilizator andrettiAndretti Naiden andretti Data 24 iulie 2013 18:10:31
Problema Zeap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
#include<stdio.h>
#include<cstring>
#include<vector>
#define pb push_back
#define mp make_pair
#define v first
#define index second
#define maxn 300005
#define mod 3000013
using namespace std;

struct pair_of_vk{int val,key;} hmin[maxn],hmax[maxn];
int nhmin,nhmax,ind;
int pmin[maxn],pmax[maxn];
vector < pair<int,int> > norm[mod];
char s[20];

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

int normalize(int val)
{
    int k=hash_key(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;
}

void swap_min(int i,int j)
{
    pair_of_vk aux;
    aux=hmin[i]; hmin[i]=hmin[j]; hmin[j]=aux;
    pmin[hmin[i].key]=i;
    pmin[hmin[j].key]=j;
}

void swap_max(int i,int j)
{
    pair_of_vk aux;
    aux=hmax[i]; hmax[i]=hmax[j]; hmax[j]=aux;
    pmax[hmax[i].key]=i;
    pmax[hmax[j].key]=j;
}

void heap_up_min(int k)
{
    if(k<=1) return;
    int i=k/2; if(hmin[k].val<hmin[i].val) {swap_min(i,k); heap_up_min(i);}
}

void heap_up_max(int k)
{
    if(k<=1) return;
    int i=k/2; if(hmax[k].val>hmax[i].val) {swap_max(i,k); heap_up_max(i);}
}

void heap_dw_min(int k)
{
    int i=2*k;
    if(i<=nhmin)
    {
        if(i+1<=nhmin && hmin[i+1].val<hmin[i].val) i++;
        if(hmin[i].val<hmin[k].val) {swap_min(i,k); heap_dw_min(i);}
    }
}

void heap_dw_max(int k)
{
    int i=2*k;
    if(i<=nhmax)
    {
        if(i+1<=nhmax && hmax[i+1].val>hmax[i].val) i++;
        if(hmax[i].val>hmax[k].val) {swap_max(i,k); heap_dw_max(i);}
    }
}

void del_min(int k)
{
    int position=pmin[k];
    swap_min(position,nhmin--);
    pmin[k]=0;
    if(position<=nhmin) heap_dw_min(position);
}

void del_max(int k)
{
    int position=pmax[k];
    swap_max(position,nhmax--);
    pmax[k]=0;
    if(position<=nhmax) heap_dw_max(position);
}

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

void read()
{
    int nr,k;
    pair_of_vk aux;
    while(!feof(stdin))
    {
        memset(s,'n',sizeof(s));
        fgets(s,sizeof(s),stdin);
        if(s[2]=='n') return;
        if(s[0]=='M')
        {
            if(s[1]=='A')
            {
                if(nhmin<2) printf("-1\n");
                else printf("%d\n",hmax[1].val-hmin[1].val);
            }
            else
            {
                if(nhmin<2) {printf("-1\n"); continue;}
                aux=hmin[1]; del_min(hmin[1].key); heap_dw_min(1);
                printf("%d\n",hmin[1].val-aux.val);
                hmin[++nhmin]=aux; pmin[aux.key]=nhmin; heap_up_min(nhmin);
            }
        }
        else
        {
            nr=number();
            k=normalize(nr);
            //printf("%d %d\n",nr,k);
            if(s[0]=='I')
            {
                if(pmin[k]) continue;
                aux.val=nr; aux.key=k;
                hmin[++nhmin]=aux; pmin[k]=nhmin; heap_up_min(nhmin);
                hmax[++nhmax]=aux; pmax[k]=nhmax; heap_up_max(nhmax);
            }
            else
             if(s[0]=='S')
             {
                 if(!pmin[k]) printf("-1\n");
                 else del_min(k),del_max(k);
             }
             else
             {
                 if(!pmin[k]) printf("0\n");
                 else printf("1\n");
             }
        }
        scanf("\n");
    }
}

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

    read();

    fclose(stdin);
    fclose(stdout);
    return 0;
}