Cod sursa(job #2299365)

Utilizator toadehuPuscasu Razvan Stefan toadehu Data 9 decembrie 2018 13:57:21
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,m,nr,v[200011],x,c,r;

struct heep
{
    int val,poz;
} heap[200011];

void swaap (heep* a, heep* b)
{
    heep temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

void e()
{
    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)
    {
        swaap(&heap[poz],&heap[poz/2]);
        v[m]=poz/2;
        v[heap[poz].poz]=poz;
        poz/=2;
    }
}

void dell(int poz)
{
    poz=v[poz];
    swaap(&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)
        {
            swaap(&heap[poz],&heap[poz*2]);
            v[heap[poz].poz]=poz;
            poz*=2;
            v[heap[poz].poz]=poz;
        }
        else
        {
            swaap(&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)
    {
        swaap(&heap[poz],&heap[poz*2]);
        v[heap[poz].poz]=poz;
        poz*=2;
        v[heap[poz].poz]=poz;
    }
}
int main()
{
    fin>>n;
    r=1;
    for (int ind=1;ind<=n;++ind)
    {
        fin>>c;
        switch (c)
        {
            case 1:
            fin>>x;
            m++;
            e();
            break;
            case 2:
            fin>>x;
            dell(x);
            break;
            default :
            fout<<heap[1].val<<"\n";
            break;
        }
    }
    return 0;
}