Cod sursa(job #2297000)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 5 decembrie 2018 10:22:33
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,m,nr,v[200011],x,c;
struct
{
    int val,poz;
}heap[200011];
void insert_heap()
{
    nr++;
    heap[nr].val=x;
    heap[nr].poz=m;
    v[m]=nr;
    int poz=nr;
    while(poz>1 && heap[poz].val<heap[poz/2].val)
    {
        swap(heap[poz],heap[poz/2]);
        v[m]=poz/2;
        v[heap[poz].poz]=poz;
        poz/=2;
    }
}
void delete_heap(int poz)
{
    poz=v[poz];
    swap(heap[poz],heap[nr]);
    nr--;
    v[heap[poz].poz]=poz;
    while(poz*2+1<=nr && (heap[poz].val>heap[poz*2].val or heap[poz].val>heap[poz*2+1].val))
    {
        if(heap[poz*2].val<heap[2*poz+1].val)
        {
            swap(heap[poz],heap[poz*2]);
            v[heap[poz].poz]=poz;
            poz*=2;
            v[heap[poz].poz]=poz;
        }
        else
        {
            swap(heap[poz],heap[poz*2+1]);
            v[heap[poz].poz]=poz;
            poz*=2;
            poz++;
            v[heap[poz].poz]=poz;
        }
    }
    if(poz*2<=nr && heap[poz].val>heap[poz*2].val)
    {
        swap(heap[poz],heap[poz*2]);
        v[heap[poz].poz]=poz;
        poz*=2;
        v[heap[poz].poz]=poz;
    }
}
int main()
{
    f>>n;
    while(n--)
    {
        f>>c;
        if(c==1)
        {
            f>>x;
            m++;
            insert_heap();
        }
        else if(c==2)
        {
            f>>x;
            delete_heap(x);
        }
        else
        {
            g<<heap[1].val<<'\n';
        }
    }
    return 0;
}