Cod sursa(job #2587810)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 23 martie 2020 16:28:09
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 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]);
        swap(v[heap[poz]],v[heap[poz/2]]);
        ascensiune(poz/2);
    }
}

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

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;
}