Cod sursa(job #1052989)

Utilizator SorinaSmeureanuSorina Smeureanu SorinaSmeureanu Data 12 decembrie 2013 00:10:48
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;

ifstream f("heapuri.in");
ofstream g("heapuri.out");

#define M 200010

int ord[M], poz[M], v[M], k=1;

void urca (int pozi)
{
    while(pozi>1 && v[ord[pozi]]<v[ord[pozi/2]])
    {
        swap(ord[pozi], ord[pozi/2]);
        poz[ord[pozi]]=pozi;
        poz[ord[pozi/2]]=pozi/2;
        pozi=pozi/2;
    }
}

void coboara(int &n, int pozi)
{
     if(2*pozi>n) return;
    int poz1=2*pozi;
    if(poz1+1<=n && v[ord[poz1]]>v[ord[poz1+1]])
        poz1++;
    if(v[ord[poz1]]<v[ord[pozi]])
    {
        swap(ord[poz1], ord[pozi]);
        poz[ord[poz1]]=poz1;
        poz[ord[pozi]]=pozi;
        coboara(n, poz1);
    }
}
void inserare(int &n, int val)
{
    n++;
    ord[n]=k;
    poz[k]=n;
    urca(n);
    k++;
}
void elimina(int &n, int pozi)
{
    poz[ord[pozi]]=0;
    ord[pozi]=ord[n];
    poz[ord[n]]=pozi;
    n--;
    urca(pozi);
    coboara(n, pozi);
}
int main()
{
    int nr, x, n=0, i, tip;
    f>>nr;
    for(i=1;i<=nr;i++)
    {
        f>>tip;
        if(tip==1)
        {
            f>>x;
            v[k]=x;
            inserare(n,k);
        }
        if(tip==2)
        {
            f>>x;
            elimina(n, poz[x]);
        }
        if(tip==3)
            g<<v[ord[1]]<<'\n';
    }
}