Cod sursa(job #1735684)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 30 iulie 2016 16:58:08
Problema Heapuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <cstdio>
#include <iostream>

using namespace std;

int m,i,heap[400010],n,poz[200010],ordcron,pos[200010];


void inserare(int x)
{
    heap[++n]=x;
    int ind=n;
    while (ind>1&&heap[ind]<heap[ind/2])
        swap(heap[ind],heap[ind/2]),swap(poz[pos[ind]],poz[pos[ind/2]]),swap(pos[ind],pos[ind/2]),ind/=2;
}

void stergere(int x)
{
    int ind=poz[x];
    heap[ind]=heap[n];
    poz[pos[ind]]=poz[poz[n]];
    pos[ind]=pos[n];
    heap[n]=2000000;
    n--;
    bool ok;
    do
    {
        ok=0;
        if (ind>1&&heap[ind]<heap[ind/2])
            swap(heap[ind],heap[ind/2]),swap(poz[pos[ind]],poz[pos[ind/2]]),swap(pos[ind],pos[ind/2]),ind/=2,ok=1;
        else if (heap[ind*2]<heap[ind]||heap[ind*2+1]<heap[ind])
        {
            if (heap[ind*2]<heap[ind*2+1])
                swap(heap[ind],heap[ind*2]),swap(poz[pos[ind]],poz[pos[ind*2]]),swap(pos[ind],pos[ind*2]),ind*=2;
            else
                swap(heap[ind],heap[ind*2+1]),swap(poz[pos[ind]],poz[pos[ind*2+1]]),swap(pos[ind],pos[ind*2+1]),ind=ind*2+1;
            ok=1;
        }
    }
    while (ok);
}

int main()
{
    FILE *IN=fopen("heapuri.in","r");
    FILE *OUT=fopen("heapuri.out","w");
    fscanf(IN,"%d",&m);
    for (i=0; i<=2*m+1; i++)
        heap[i]=2000000000;
    for (i=1; i<=m; i++)
    {
        int cod,x;
        fscanf(IN,"%d",&cod);
        if (cod==1)
            fscanf(IN,"%d",&x),poz[++ordcron]=n+1,pos[n+1]=ordcron,inserare(x);
        else if (cod==2)
            fscanf(IN,"%d",&x),stergere(x);
        else
            fprintf(OUT,"%d\n",heap[1]);
        /*for (int z=1; z<=n; z++)
            fprintf(OUT,"%d %d %d  ",heap[z],pos[z],poz[z]);
        fprintf(OUT,"\n");*/
    }
}