Cod sursa(job #774135)

Utilizator gicu_01porcescu gicu gicu_01 Data 3 august 2012 15:58:31
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <stdio.h>
#define nmax 200001
using namespace std;
int n,m,b[nmax],a[nmax],c[nmax],npoz;

void sw(int *a,int *b)
{
    int t=*a; *a=*b; *b=t;
}

void swap(int poz,int nod)
{
    sw(&a[poz],&a[nod]);
    sw(&c[poz],&c[nod]);
    b[c[poz]]=poz;
    b[c[nod]]=nod;
}

void up(int nod)
{
    if (nod==1) return;
    int poz=nod/2;
    if ( a[poz]>a[nod] )
    {
        swap(poz,nod);
        if (poz>1) up(poz);
    }
}

void down(int nod)
{
    if (nod>n) return;
    int poz1=nod*2;
    int poz2=nod*2+1;
    if ( a[poz1]<a[nod] && poz1<=n)
    {
        swap(poz1,nod);
        down(poz1);
    }
    if ( a[poz2]<a[nod] && poz2<=n )
    {
        swap(poz2,nod);
        down(poz2);
    }
}

void add(int val)
{
    n++;
    npoz++;
    a[n]=val;
    c[n]=npoz;
    b[npoz]=npoz;
    up(n);
}

void cut(int nod)
{
    int t=b[nod];
    if (b[nod]==n) n--;
    else
    {
        swap(n,b[nod]);
        n--;
        up(t);
        down(t);
    }
}

int main()
{
    int i,k,p,j;
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%i",&m);
    n=0;npoz=0;
    for (i=1; i<=m; i++)
    {
        scanf("%i",&k);
        switch(k)
        {
            case 1:{
                 scanf("%i",&p);
                 add(p);
                 break;
                 }
            case 2:{
                scanf("%i",&p);
                cut(p);
                break;
                }
            default: {
                printf("%i\n",a[1]);
                break;
                }
        }
    }
    return 0;
}