Cod sursa(job #774094)

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

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

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

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

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

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

void add(int val)
{
    n++;
    npoz++;
    a[n].x=val;
    a[n].y=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].x);
                break;
                }
        }
    }
    return 0;
}