Cod sursa(job #2610570)

Utilizator tavi255Varzaru Octavian Stefan tavi255 Data 5 mai 2020 01:40:31
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
//#include <iostream>
#include <fstream>
using namespace std;

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

const int Max=200005;

int n,heap[Max],el[Max],poz[Max],m,op,l,nr,x;

void add(int x)
{
    heap[++l]=++nr;
    poz[nr]=l;
    el[nr]=x;

    int val=l;

    while(val/2 && el[heap[val]]<el[heap[val/2]])
    {
       swap(heap[val],heap[val/2]); swap(poz[heap[val/2]],poz[heap[val]]);
       val/=2;
    }

}

void del(int pz)
{
    swap(heap[pz],heap[l]); swap(poz[heap[pz]],poz[heap[l]]); l--;

    bool isheap=0;

    while(pz*2<=l && !isheap)
    {
        if(2*pz+1<=l)
        {
            int mx=2*pz;
            if(el[heap[mx]]>el[heap[mx+1]])
                mx++;
            if(el[heap[pz]]>el[heap[mx]])
            {
                swap(heap[pz],heap[mx]); swap(poz[heap[pz]],poz[heap[mx]]);
                pz=mx;
            }
            else
                isheap=1;
        }
        else if(el[heap[pz]]>el[heap[2*pz]])
        {
               swap(heap[pz],heap[2*pz]); swap(poz[heap[pz]],poz[heap[2*pz]]);  pz=2*pz;
        }

        else
            isheap=1;

    }
}

void citire()
{
    in>>n;
    for(int i=1;i<=n;i++)
    {
       in>>op;
       if(op==1 || op==2)
        in>>x;
       if(op==1)
       add(x);
       else if(op==2)
        del(poz[x]);
       else
        out<<el[heap[1]]<<"\n";
    }
}


int main()
{
    citire();
    return 0;
}