Cod sursa(job #2517071)

Utilizator Rares31100Popa Rares Rares31100 Data 2 ianuarie 2020 20:33:55
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <bits/stdc++.h>
#define Val first
#define Poz second

using namespace std;

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

int n;
pair<int,int> heap[200001];
int vf;
int pozHeap[200001];

void insertHeap(int val,int toKeep)
{
    int poz=++vf;
    heap[poz].Val=val;
    heap[poz].Poz=vf;

    while(heap[poz].Val<heap[poz/2].Val)
    {
        swap(heap[poz],heap[poz/2]);
        pozHeap[ heap[poz].Poz ]=poz;
        poz/=2;
    }

    pozHeap[toKeep]=poz;
}

void combHeap(int poz,int endHeap)
{
    int tata=poz,fiu=poz*2;

    while(fiu<=endHeap)
    {
        if(fiu<endHeap && heap[fiu].Val>heap[fiu+1].Val)
            fiu++;

        if(heap[tata].Val>heap[fiu].Val)
        {
            swap(heap[tata],heap[fiu]);

            pozHeap[ heap[tata].Poz ]=tata;
            pozHeap[ heap[fiu].Poz ]=fiu;

            tata=fiu;
            fiu=tata*2;
        }
        else
            break;
    }
}

int main()
{
    in>>n;

    for(int q,val,i=1;i<=n;i++)
    {
        in>>q;

        switch(q)
        {
            case 1:
                in>>val;
                insertHeap(val,i);

                break;
            case 2:
                in>>val;
                heap[ pozHeap[val] ]=heap[vf--];

                combHeap(pozHeap[val],vf);

                break;
            case 3:
                out<<heap[1].Val<<'\n';

                break;
        }
    }

    return 0;
}