Cod sursa(job #2002618)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 20 iulie 2017 14:13:02
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>

using namespace std;

FILE *in,*out;

const int NMAX = 200005;

int heap[NMAX],f[NMAX],v[NMAX];

int sizeheap;

void swap(int p1,int p2)
{
    int tmp = heap[p1];
    heap[p1] = heap[p2];
    heap[p2] = tmp;
    tmp = f[heap[p1]];
    f[heap[p1]] = f[heap[p2]];
    f[heap[p2]] = tmp;
}

void urca(int p)
{
    if(p == 1)
        return;
    if(v[heap[p]]< v[heap[p/2]])
    {
        swap(p,p/2);
        urca(p/2);
    }
}

void coboara(int p)
{
    int dest = p;
    if(sizeheap >= p*2 && v[heap[p]] > v[heap[p*2]])
    {
        dest = p*2;
    }
    if(sizeheap >= p*2+1 && v[heap[dest]] > v[heap[p*2+1]])
        dest = p*2+1;
    if(dest != p){
        swap(dest,p);
        coboara(dest);
    }
}

void add(int nr,int indice)
{
    sizeheap ++;
    v[indice] = nr;
    heap[sizeheap] = indice;
    f[indice] = sizeheap;
    urca(sizeheap);
}

void sterge(int poz)
{
    int indice = f[poz];
    swap(sizeheap,indice);
    heap[sizeheap] = 0;
    sizeheap --;
    if(sizeheap+1 != indice){
    urca(indice);
    coboara(indice);
    }
}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    int n,indice = 0;
    scanf("%d",&n);
    for(int i = 1;i <= n;i ++)
    {
        if(i==41)
        {
        i=41;
        }
        int t;
        scanf("%d",&t);
        if(t != 3)
        {
            int nr;
            scanf("%d",&nr);
            if(t == 1)
               add(nr,++indice);
            if(t == 2)
                sterge(nr);
        }
        else
            printf("%d\n",v[heap[1]]);
    }

    return 0;
}