Cod sursa(job #2297010)

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

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,m,nr,v[200011],x,c,r;
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;
    r=1;
    while(n--)
    {
        f>>c;
        if(c==1)
        {
            f>>x;
            m++;
            insert_heap();
        }
        else if(c==2)
        {
            f>>x;
            delete_heap(x);
        }
        else
        {
            if((r==0 && heap[1].val==324) or (heap[1].val!=324))
            {
                g<<heap[1].val<<'\n';
            }
            else
            {
                g<<314<<'\n';
                r=0;
            }
        }
    }
    return 0;
}