Cod sursa(job #1231324)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 20 septembrie 2014 12:06:14
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <cstdio>
#define N 200010

using namespace std;
int n,i,cod,val,t,lg,x[N],h[N],p[N];
void heap_down(int),heap_up(int),swap(int,int);
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&n);
    for(;n;n--)
    {
        scanf("%d",&cod);
        if(cod==1)
        {
            scanf("%d",&val);
            x[++t]=val;
            p[t]=++lg;
            h[lg]=t;
            heap_up(lg);
            continue;
        }
        if(cod==2)
        {
            scanf("%d",&val);
            int poz=p[val];
            swap(poz,lg);
            lg--;
            heap_up(poz);
            heap_down(poz);
            continue;
        }
        printf("%d\n",x[h[1]]);
    }
    return 0;
}
void heap_up(int nod)
{
    int tata=nod/2;
    if(!tata)return;
    if(x[h[tata]]>x[h[nod]])
    {
        swap(nod,tata);
        heap_up(tata);

    }
}
void heap_down(int nod)
{
    int fiu=2*nod;
    if(fiu>lg)return;
    if(fiu<lg)
        if(x[h[fiu]]>x[h[fiu+1]])
            fiu++;
    if(x[h[fiu]]<x[h[nod]])
    {
        swap(fiu,nod);
        heap_down(fiu);
    }
}
void swap(int i,int j)
{
        int aux=h[i];h[i]=h[j];h[j]=aux;
        p[h[i]]=i;
        p[h[j]]=j;

}