Cod sursa(job #2587824)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 23 martie 2020 16:46:55
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#define NMAX 200005

using namespace std;

ifstream cin("heapuri.in");
ofstream cout("heapuri.out");

int v[NMAX],heap[NMAX],L,k,val[NMAX];

void ascensiune(int poz)
{
    if(val[heap[poz]]<val[heap[poz/2]])
    {
        swap(heap[poz],heap[poz/2]);
        v[heap[poz]]=poz;
        v[heap[poz/2]]=poz/2;
        ascensiune(poz/2);
    }
}

void coborare(int poz)
{
    int cv=0;
    if(2*poz<=L)
        cv=2*poz;
    if(2*poz+1<=L && val[heap[2*poz+1]]<val[heap[2*poz]])
        cv=2*poz+1;
    if(val[heap[cv]]>=val[heap[poz]])
        cv=0;
    if(cv)
    {
        swap(heap[cv],heap[poz]);
        v[heap[poz]]=poz;
        v[heap[cv]]=cv;
        coborare(cv);
    }
}

int main()
{
    heap[0]=0;
    val[heap[0]]=-2e9;
    int n,op,tip,nr;
    cin>>n;
    for(op=1;op<=n;op++)
    {
        cin>>tip;
        if(tip==3)
            cout<<val[heap[1]]<<'\n';
        else
        {
            cin>>nr;
            if(tip==1)
            {
                L++,k++;
                heap[L]=k;
                val[k]=nr;
                v[k]=L;
                ascensiune(L);
            }
            else
            {
                int pozitie=v[nr];
                heap[v[nr]]=heap[L];
                v[heap[L]]=v[nr];
                v[nr]=-1;
                L--;
                if(val[heap[pozitie]]<val[heap[pozitie/2]])
                    ascensiune(pozitie);
                else
                    coborare(pozitie);
            }
        }
    }
    return 0;
}