Cod sursa(job #3038308)

Utilizator CelestinNegraru Celestin Celestin Data 27 martie 2023 10:56:55
Problema Heapuri Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#define maxi 200005
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,heap[maxi],op,x,coada[maxi],k,dim;
unordered_map<int,int> pos;
void promovare(int n,int k)
{
    bool ok=false;
    while(k>1&&!ok)
    {
        if(heap[k>>1]<heap[k])
            ok=true;
        else{
            swap(pos[heap[k]],pos[heap[k>>1]]);
            swap(heap[k>>1],heap[k]);
            k>>=1;
        }
    }
    return;
}
inline int minim()
{
    return heap[1];
}
void cernere(int n,int k)
{
    bool ok=false;
    while(2*k<=n&&!ok)
    {
        int p=2*k;
        if(p+1<=n)
        {
            if(heap[p+1]<heap[p])
                p++;
        }
        if(heap[k]<heap[p])
            ok=true;
        else{
            swap(pos[heap[k]],pos[heap[p]]);
            swap(heap[k],heap[p]);
            k=p;
        }
    }
    return;
}
void eliminare(int&n,int k)
{
    swap(heap[k],heap[n]);
    n--;
    if(k>1&&heap[k]<heap[k>>1])
        promovare(n,k);
    else cernere(n,k);
    return;
}
void queries()
{
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>op;
        switch(op)
        {
            case 1:{
                f>>x;
                coada[++k]=x;
                heap[++dim]=x;
                pos[x]=dim;
                promovare(dim,dim);
            }break;
            case 2:{
                f>>x;
                eliminare(dim,pos[coada[x]]);
            }break;
            case 3:{
                g<<minim()<<'\n';
            }break;
        }
    }
    f.close();
    g.close();
    return;
}
int main()
{
    queries();
    return 0;
}