Cod sursa(job #2810434)

Utilizator Ana100Ana-Maria Tomoiala Ana100 Data 29 noiembrie 2021 14:31:21
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>

using namespace std;
ifstream cin("heapuri.in");
ofstream cout("heapuri.out");
const int NMAX=2e5;
int heapsize;
int heap[NMAX], poz[NMAX],a[NMAX];// poz patreaza la ce nod se afla val introdusa a i in ordine cronologica, heap pastreaza faptul ca pe nodul i se gaseste valcitita a i cronologic
int parent(int i) {return (i-1)/2;}
int leftchild(int i) {return i*2;}
int rightchild(int i) {return i*2+1;}
void upheap(int i)
{
    while(i!=0 and a[heap[parent(i)]]>a[heap[i]])
    {
        swap(heap[parent(i)],heap[i]);
        poz[heap[parent(i)]]=parent(i);
        poz[heap[i]]=i;
        i=parent(i);
    }
}
void downheap(int i)
{
    int left, right, smallest;
    smallest=i;
    left=leftchild(i);
    right=rightchild(i);
    if(left<heapsize and a[heap[left]]<a[heap[smallest]])
    {
        smallest=left;
    }
    if(right<heapsize and a[heap[right]]<a[heap[smallest]])
    {
        smallest=right;
    }
    if(i!=smallest)
    {
    swap(heap[i],heap[smallest]);
    poz[heap[i]]=i;
    poz[heap[smallest]]=smallest;
    downheap(smallest);
    }
}
void inserare(int nr)
{
    heap[heapsize++]=nr;
    upheap(heapsize-1);
}
void extractmin()
{
    int minval;
    minval=a[heap[0]];
    heap[0]=heap[--heapsize];
    downheap(0);
}
int getmin()
{
    return heap[0];
}
void update(int i, int j)
{
    heap[i]=j;
    upheap(i);
    downheap(i);
}
void eras(int i)
{
    update(i,getmin());// ma intereseaza pozitia lui min
    extractmin();
}
int main()
{
    int n,cer,nr=0,x;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>cer;
        if(cer==1)
        {
            nr++;
            cin>>a[nr];
            poz[nr]=nr;
            inserare(nr);
        }
        else if(cer==2)
        {
            cin>>x;
            eras(poz[x]);
        }
        else
        {
            cout<<a[getmin()]<<'\n';
        }
    }
    return 0;
}