Cod sursa(job #852856)

Utilizator dariusdariusMarian Darius dariusdarius Data 11 ianuarie 2013 20:45:24
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
int k,c,n,h[200200],p[200200],ind[200200];
void swappp(int v1,int v2)
{
    swap(ind[v1],ind[v2]);
    p[ind[v1]]=v1; p[ind[v2]]=v2;
    swap(h[v1],h[v2]);
}
void down(int nod)
{
    bool ok;
    do
    {
        ok=false;
        int fiu=nod;
        /** trebuie sa interschimb nodul curent cu fiul cu valoare maxima */
        if(2*nod<=n && h[fiu]>h[2*nod])
        { ok=true; fiu=2*nod; }
        if(2*nod+1<=n && h[fiu]>h[2*nod+1])
        { ok=true; fiu=2*nod+1; }
        if(ok)
        { swappp(nod,fiu); nod=fiu; }
    }while(ok);
}

void up(int nod)
{
    /**interschimb nodul cu tatal lui, atata vreme cat el e mai mic decat acesta */
    while(nod>1 && h[nod]<h[nod/2])
    {
        swappp(nod,nod/2);
        nod>>=1;
    }
}
void insert(int x) { h[++n]=x; p[c]=n; ind[n]=c; up(n); }
void del(int x)
{
    int nod=p[x];
    swappp(nod,n); n--;
    up(nod);
    down(nod);
}
int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    scanf("%d",&k);
    int t,x;
    for(int i=1;i<=k;i++)
    {
        scanf("%d",&t);
        if(t==3)
            printf("%d\n",h[1]);
        else if(t==1) {scanf("%d",&x);c++;insert(x);}
        else
        {
            scanf("%d",&x);
            del(x);
        }
    }
    return 0;
}