Cod sursa(job #2587830)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 23 martie 2020 16:50:57
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.01 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)
{
    if(poz*2==L)
    {
        if(val[heap[poz]]>val[heap[poz*2]])
        {
            swap(heap[poz],heap[poz*2]);
            v[heap[poz]]=poz;
            v[heap[poz*2]]=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]);
                v[heap[poz]]=poz;
                v[heap[poz*2]]=poz*2;
                coborare(2*poz);
            }
            else
            {
                swap(heap[poz],heap[poz*2+1]);
                v[heap[poz]]=poz;
                v[heap[poz*2+1]]=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;
}