Cod sursa(job #2835997)

Utilizator MenelausSontea Vladimir Menelaus Data 19 ianuarie 2022 16:44:10
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb

#include <stdio.h>

int A[200001],nr,ord[200001],cont;
bool use[200001];

void down(int x)
{
    int aux,ok=1,r;
    while (ok)
    {
        ok=0;
        if (2*x<=nr) r = 2*x;
        if (2*x+1<=nr) if (A[2*x+1]<A[r]) r++;
        if (A[r]<A[x]) ok=1;
        if (ok)
        {
            aux = A[r];
            A[r] = A[x];
            A[x] = aux;
            aux = ord[r];
            ord[r] = ord[x];
            ord[x] = aux;
            x=r;
        }
    }
}
void up(int x)
{
    int aux;
    while (A[x/2]>A[x] && x!=1)
    {
        aux = A[x];
        A[x] = A[x/2];
        A[x/2] = aux;
        aux = ord[x/2];
        ord[x/2] = ord[x];
        ord[x] = aux;
        x=x/2;
    }
}
void add(int x)
{
    nr++;
    cont++;
    A[nr] = x;
    ord[nr] = cont;
    up(nr);
}
void del(int x)
{
    A[1] = A[nr];
    ord[1] = ord[nr];
    nr--;
    down(1);
}

int main()
{
    FILE *in = fopen("heapuri.in","r");
    FILE *out = fopen("heapuri.out","w");

    int n;
    fscanf(in,"%d",&n);
    int i,x,y;
    for (i=1; i<=n; i++)
    {
        fscanf(in,"%d",&x);
        if (x==1) fscanf(in,"%d",&y),add(y);
        else if (x==2) fscanf(in,"%d",&y),use[y]=1;
        else
        {
            while (use[ord[1]]) del(1);
            fprintf(out,"%d\n",A[1]);
        }
    }
}