Cod sursa(job #3211733)

Utilizator XIIs12sPeteleu Denis Andrei XIIs12s Data 10 martie 2024 10:40:09
Problema Heapuri Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
const int nmax=200005;
int heap[nmax],v[nmax],del[nmax];
void sift(int i,int n)
{
    int imin,vmin,val;
    imin=i;
    vmin=val=heap[imin];
    if(2*i<=n&&v[heap[2*i]]<v[vmin])
    {
        imin=2*i;
        vmin= heap[imin];
    }
    if(2*i+1<=n&&v[heap[2*i+1]]<v[vmin])
    {
        imin = 2*i+1;
        vmin= heap[imin = 2*i+1];
    }
    while(imin >i)
    {
        heap[i]= heap[imin];
        i=imin;
        vmin= val;
        if(2*i<=n && v[heap[2*i]] < v[vmin])
        {
            imin=2*i;
            vmin= heap[imin];
        }
        if(2*i+1<=n&&v[heap[2*i+1]]<v[vmin])
        {
            imin = 2*i+1;
            vmin = heap[imin = 2*i+1];
        }
    }
    heap[i]=val;
}
void prelocate(int i)
{
    int c,val=heap[i];
    c=i/2;
    while(i>1&&v[heap[c]]> v[val])
    {
        heap[i] = heap[c];
        i=c;
    }
    heap[i]=val;
}
void inserted(int i,int &n)
{
    n++;
    heap[n]=i;
    prelocate(n);
}
void deleted(int &n)
{
    n--;
    heap[1]=heap[n];
    sift(1,n);
}
int main()
{
    int n;
    f>>n;
    int pos=0,m=0;
    while(n--)
    {
        int type;
        f>>type;
        if(type==1)
        {
            f>>v[++pos];
            inserted(pos,m);
        }
        else if(type==2)
        {
            int val;
            f>>val;
            del[val]=1;
        }
        else
        {
            while(del[heap[1]])
                deleted(m);
            g<<v[heap[1]]<<'\n';
        }
    }
    return 0;
}