Cod sursa(job #2505120)

Utilizator Vasilescu_CosminVasilescu Cosmin Vasilescu_Cosmin Data 6 decembrie 2019 10:55:39
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

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

int n,l,nr;

int A[200010],Heap[200010],Pos[200010];

void push(int x)
{
    while(x/2 && A[Heap[x]]<A[Heap[x/2]])
    {
        swap(Heap[x],Heap[x/2]);
        swap(Pos[Heap[x]],Pos[Heap[x/2]]);
        x/=2;
    }
}

void pop()
{
    int y=0,x=1;
    while(x!=y)
    {
        y=x;
        if(y*2<=l && A[Heap[x]]>A[Heap[y*2]])
            x=y*2;
        if(y*2+1<=l && A[Heap[x]]>A[Heap[y*2+1]])
            x=y*2+1;
        swap(Heap[x],Heap[y]);
        swap(Pos[Heap[x]],Pos[Heap[y]]);
    }
}

int main()
{
    int i,x,cod;
    in>>n;
    for(i=1; i<=n; i++)
    {
        in>>cod;
        if(cod==1)
        {
            in>>x;
            l++;
            nr++;
            A[nr]=x;
            Heap[l]=nr;
            Pos[nr]=l;
            push(l);
        }
        if(cod==2)
        {
            in>>x;
            A[x]=-1;
            push(Pos[x]);
            Pos[Heap[1]]=0;
            Heap[1]=Heap[l--];
            Pos[Heap[1]]=1;
            if(l>1)
                pop();
        }
        if(cod==3)
            out<<A[Heap[1]]<<'\n';
    }
    return 0;
}