Cod sursa(job #1799492)

Utilizator sahleancosminSahlean Cosmin sahleancosmin Data 6 noiembrie 2016 13:35:03
Problema Heapuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int n,heap[200001],poz[200001],val[200001],fin;
void up(int i)
{
    while(val[heap[i]]<val[heap[i/2]])
    {
        int aux=heap[i];
        heap[i]=heap[i/2];
        heap[i/2]=aux;
        aux=poz[val[heap[i]]];
        poz[val[heap[i]]]=poz[val[heap[i/2]]];
        poz[val[heap[i/2]]]=aux;
        i/=2;
    }
}
void down(int i)
{
    int minim;
    while(2*i<=fin)
    {
        if(2*i+1<=fin)
            if(val[heap[2*i+1]]>val[heap[2*i]])
                minim=2*i;
            else minim=2*i+1;
        else minim=2*i;
        if(val[heap[i]]>val[heap[minim]])
        {
            int aux=heap[i];
            heap[i]=heap[minim];
            heap[minim]=aux;
            aux=poz[val[heap[i]]];
            poz[val[heap[i]]]=poz[val[heap[minim]]];
            poz[val[heap[minim]]]=aux;
        }
        i=minim;
    }
}
void sterge(int i)
{
    heap[i]=heap[fin];
    poz[val[heap[i]]]=poz[val[heap[fin--]]];
    up(i);
    down(i);
}
int main()
{
   f>>n;
   int task,x;
   for(int i=1;i<=n;i++)
   {
       f>>task;
       if(task==1)
       {
           f>>x;
           fin++;
           poz[x]=fin;
           val[fin]=x;
           heap[fin]=fin;
           up(fin);
       }else
       if(task==2)
       {
           f>>x;
           sterge(poz[val[x]]);
       }
       else g<<val[heap[1]]<<"\n";
   }
   g<<endl;
    return 0;
}