Cod sursa(job #1533152)

Utilizator zertixMaradin Octavian zertix Data 22 noiembrie 2015 10:19:54
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <cstdio>
using namespace std;

int n,v[200002],inuri;
pair <int ,int >heap[200002];

void adaugare(int x)
{
    heap[++n].first=x;
    v[++inuri]=n;
    heap[n].second=inuri;

    int n1=n;
    while (n1>1)
    {
        if (heap[n1].first > heap[n1/2].first)
            break;
        swap(v[heap[n1].second],v[heap[n1/2].second]);
        swap(heap[n1],heap[n1/2]);
        n1/=2;
    }
}

void sterg(int poz)
{
    swap(v[heap[poz].second],v[heap[n].second]);
    heap[poz]=heap[n--];

    if (heap[poz] < heap[poz/2])
        while (poz>1 && heap[poz/2] > heap[poz])
    {
        swap(v[heap[poz].second],v[heap[poz/2].second]);
        swap(heap[poz/2],heap[poz]);
        poz/=2;
    }
    else
        while (1)
    {
        int fpoz=2*poz;

        if (fpoz>n)
            break;

        if ( fpoz+1 <=n && heap[fpoz] > heap[fpoz+1])
            fpoz++;

        if (heap[fpoz] >= heap[poz])
            break;
        swap(v[heap[fpoz].second],v[heap[poz].second]);
        swap(heap[fpoz],heap[poz]);
        poz=fpoz;
    }
}

void solve ()
{
    int nr;
    scanf("%d",&nr);
    int op,a;
    for (int i=1; i<=nr; ++i)
    {
        scanf("%d",&op);
        if (op==1)
            {
                scanf("%d",&a);
                adaugare(a);
            }
        else
        {
            if (op==2)
            {
                scanf("%d",&a);
                sterg(v[a]);
            }
            else
                printf("%d\n",heap[1]);

        }
    }

}

int main()
{
    freopen("heapuri.in","r",stdin);
    freopen("heapuri.out","w",stdout);
    solve();
    return 0;

}