Cod sursa(job #774339)

Utilizator gicu_01porcescu gicu gicu_01 Data 4 august 2012 13:18:20
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <stdio.h>
#define nmax 200001
using namespace std;
int n,m,Poz[nmax],npoz;

struct nod{
   int x;
   int y;
} H[nmax];

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


void up(int nod)
{
    int poz,t=1;
    while ( t )
    {
        t=0;
        poz = nod/2;
        if (poz>=1 && H[poz].x>H[nod].x )
        {
            sw(&H[poz],&H[nod]);
            Poz[H[poz].y]=poz;
            Poz[H[nod].y]=nod;
            t=1;
        }
        nod=nod/2;
    }
}

void down(int nod)
{
    if (nod>n) return;
    int poz1=nod*2;
    int poz2=nod*2+1;
    if ( H[poz1].x<H[nod].x && poz1<=n)
    {
        sw(&H[poz1],&H[nod]);
        Poz[H[poz1].y]=poz1;
        Poz[H[nod].y]=nod;
        down(poz1);
    }
    if ( H[poz2].x<H[nod].x && poz2<=n )
    {
        sw(&H[poz2],&H[nod]);
        Poz[H[poz2].y]=poz2;
        Poz[H[nod].y]=nod;
        down(poz2);
    }
}

void add(int val)
{
    n++;
    npoz++;
    H[n].x=val;
    H[n].y=npoz;
    Poz[npoz]=npoz;
    up(n);
}

void cut(int nod)
{
    int t=Poz[nod];
    if (t==n) n--;
    else
    {
        sw(&H[n],&H[Poz[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",H[1].x);
                break;
                }
        }
    }
    return 0;
}