Cod sursa(job #896329)

Utilizator gabriel93Robu Gabriel gabriel93 Data 27 februarie 2013 15:10:17
Problema Zeap Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.71 kb
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define Nmax 300002
using namespace std;
int nmin,nmax;
int hmin[Nmax],hmax[Nmax];

void hmin_jos(int x)
{
    int fs,fd,k;
    do
    {
        k=0;
        fs=x<<1;
        fd=fs+1;
        if(fs<=nmin)
        {
            k=fs;
            if(fd<=nmin && hmin[fd]<hmin[fs])
                k=fd;
            if(hmin[k]>=hmin[x])
                k=0;
        }
        if(k)
        {
            swap(hmin[k],hmin[x]);
            x=k;
        }
    }while(k);
}

void hmin_sus(int x)
{
    int t;
    t=x>>1;
    while(t>=1 && hmin[t]>hmin[x])
    {
        swap(hmin[t],hmin[x]);
        x=t;
        t=x>>1;
    }
}

int hmin_caut(int p,int x)
{
    int y;
    if(p>nmin)
        return 0;
    if(hmin[p]==x)
        return p;
    if(hmin[p]<x)
    {
        y=hmin_caut(p<<1,x);
        if(y)
            return y;
        y=hmin_caut((p<<1)+1,x);
        return y;
    }
    return 0;
}

int hmin_add(int x)
{
    int y;
    y=hmin_caut(1,x);
    if(y)
        return 1;
    ++nmin;
    hmin[nmin]=x;
    hmin_sus(nmin);
    return 0;
}

int hmin_del(int x)
{
    int y;
    if(nmin<=0)
    {
        printf("-1\n");
        return 0;
    }
    y=hmin_caut(1,x);
    if(y==0)
    {
        printf("-1\n");
        return 0;
    }
    hmin[y]=hmin[nmin];
    --nmin;
    hmin_jos(y);
    return 1;
}

void hmax_jos(int x)
{
    int fs,fd,k;
    do
    {
        k=0;
        fs=x<<1;
        fd=fs+1;
        if(fs<=nmax)
        {
            k=fs;
            if(fd<=nmax && hmax[fd]>hmax[fs])
                k=fd;
            if(hmax[k]<=hmax[x])
                k=0;
        }
        if(k)
        {
            swap(hmax[k],hmax[x]);
            x=k;
        }
    }while(k);
}

void hmax_sus(int x)
{
    int t;
    t=x>>1;
    while(t>=1 && hmax[t]<hmax[x])
    {
        swap(hmax[t],hmax[x]);
        x=t;
        t=x>>1;
    }
}

void hmax_add(int x)
{
    ++nmax;
    hmax[nmax]=x;
    hmax_sus(nmax);
}

int hmax_caut(int p,int x)
{
    int y;
    if(p>nmax)
        return 0;
    if(hmax[p]==x)
        return p;
    if(hmax[p]>x)
    {
        y=hmax_caut(p<<1,x);
        if(y)
            return y;
        y=hmax_caut((p<<1)+1,x);
        return y;
    }
    return 0;
}

void hmax_del(int x)
{
    int y;
    if(hmax<=0)
        return;
    y=hmax_caut(1,x);
    if(y==0)
        return;
    hmax[y]=hmax[nmax];
    --nmax;
    hmax_jos(y);
}

void rezolv()
{
    char s[50];
    int x,i,y;
    while(fgets(s,50,stdin))
    {
        if(s[0]=='M')
        {
            if(nmin<2)
            {
                printf("-1\n");
                continue;
            }
            if(s[1]=='A')
                printf("%d\n",hmax[1]-hmin[1]);
            else
                printf("%d\n",min(hmin[2],hmin[3])-hmin[1]);
        }
        else
        {
            x=0;
            for(i=2;s[i]!='\n'&&s[i]!=0;++i)
                x=x*10+s[i]-'0';
            if(s[0]=='I')
            {
                y=hmin_add(x);
                if(y==0)
                    hmax_add(x);
                continue;
            }
            if(s[0]=='C')
            {
                y=hmin_caut(1,x);
                if(y==0)
                    printf("0\n");
                else
                    printf("1\n");
                continue;
            }
            y=hmin_del(x);
            if(y==1)
                hmax_del(x);
        }
    }
}

int main()
{
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    rezolv();
    fclose(stdin);
    fclose(stdout);
    return 0;
}