Cod sursa(job #2897567)

Utilizator maria10Cioclov Maria maria10 Data 4 mai 2022 00:31:29
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, v[200005],c,x,k,ord[200005],nr,ind[200005];

void insereaza(int x)
{
    nr++;
    k++;
    ord[k]=nr;
    ind[nr]=k;
    v[k]=x;
    int i=k;
    while(i/2 && v[i/2]>v[i])
    {
        swap(v[i/2], v[i]);
        swap(ind[ord[i/2]], ind[ord[i]]);
        swap(ord[i/2], ord[i]);
        i=i/2;
    }
}

void sterge(int i)
{
    v[i]=v[k];
    ind[ord[k]]=i;
    ord[i]=ord[k];
    k--;
    int x=i;

    while(i/2 && v[i/2]>v[i])
    {
        swap(v[i/2], v[i]);
        swap(ind[ord[i/2]], ind[ord[i]]);
        swap(ord[i/2], ord[i]);
        i=i/2;
    }

    i=x;

    while(i*2<=k)
        {
            x=2*i;
            if(2*i+1<=k && v[2*i+1]<v[2*i]) x=2*i+1;
            if(v[x]<v[i])
            {
                swap(v[x], v[i]);
                swap(ind[ord[x]], ind[ord[i]]);
                swap(ord[x], ord[i]);
                i=x;
            }
            else break;
        }

}

int main()
{
    fin>>n;
    for(int i=0;i<n;i++)
    {
        fin>>c;
        if(c==3) fout<<v[1]<<'\n';
        else if(c==1)
        {
            fin>>x;
            insereaza(x);
        }
        else
        {
            fin>>x;
            sterge(ind[x]);
        }
    }
}