Cod sursa(job #2905612)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 22 mai 2022 16:58:16
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <fstream>

using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
const int NMAX=2e5+1;
int heap[NMAX],poz[NMAX],invpoz[NMAX],cnt=0,heap_size=0;
void push(int x)
{
    heap_size++;
    cnt++;
    heap[heap_size]=x;
    poz[cnt]=heap_size;
    invpoz[heap_size]=cnt;
    int parent=heap_size/2;
    int child=heap_size;
    while(heap[parent]>heap[child])
    {
        swap(heap[parent],heap[child]);
        swap(poz[invpoz[child]],poz[invpoz[parent]]);
        swap(invpoz[child],invpoz[parent]);
        child=parent;
        parent=child/2;
    }
}
void erase1(int pozcer)
{
    int heap_index=poz[pozcer];
    heap[heap_index]=heap[heap_size];
    heap_size--;
    int parent=heap_index;
    int child1=parent*2,child2=parent*2+1;
    int x=0;
    while(heap[child1]<heap[parent] or heap[child2]<heap[parent])
    {
        x=1;
        if(heap[child1]<heap[child2] and child1<=heap_size)
        {
            swap(heap[parent],heap[child1]);
            swap(poz[invpoz[child1]],poz[invpoz[parent]]);
            swap(invpoz[child1],invpoz[parent]);
            parent=child1;
        }
        else if(heap[child2]<heap[child1] and child2<=heap_size)
        {
                 swap(heap[parent],heap[child2]);
                 swap(poz[invpoz[child2]],poz[invpoz[parent]]);
                 swap(invpoz[child2],invpoz[parent]);
                 parent=child2;
        }
        else
        {
            break;
        }
        child1=parent*2;
        child2=parent*2+1;
    }
    if(x==0)
    {
        int child=heap_index;
        parent=child/2;
        while(heap[parent]>heap[child])
        {
            swap(heap[parent],heap[child]);
            poz[cnt]=child;
            invpoz[child]=cnt;
            child=parent;
            parent=child/2;
        }
    }
}

int main()
{
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        int cer;
        cin>>cer;
        if(cer==1)
        {
            int x;
            cin>>x;
            push(x);
        }
        else if(cer==2)
        {
            int pozcer;
            cin>>pozcer;
            erase1(pozcer);
        }
        else if(cer==3)
        {
            cout<<heap[1]<<endl;
        }
    }
    return 0;
}