Cod sursa(job #1994650)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 25 iunie 2017 16:12:35
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int v[200001], X[200001], poz2[200001],i,n,cod,y,n2,k;
void interschimbare(int a, int b)
{
    int aux;
    aux=v[a];
    v[a]=v[b];
    v[b]=aux;
    poz2[v[a]]=a;
    poz2[v[b]]=b;

}
void Urcare(int poz)
{
    if(poz==1 || X[v[poz/2]]<=X[v[poz]])
        return;
    interschimbare(poz/2,poz);
    Urcare(poz/2);
}
void CoborareStergere(int poz)
{
    int st=poz*2,dr=poz*2+1,maxim=poz;
    if(st<=n2 and X[v[st]]<X[v[maxim]])
        maxim=st;
    if(dr<=n2 and X[v[dr]]<X[v[maxim]])
        maxim=dr;
    if(maxim!=poz)
    {
        interschimbare(poz,maxim);
        CoborareStergere(maxim);
    }

}
int main()
{
  fin >> n;
  n2=0;
  k=0;
  for(i=1;i<=n;i++)
  {
     fin >> cod;
     if(cod==1)
     {
        fin >> X[++k];
        v[++n2]=k;
        poz2[k]=n2;
        Urcare(n2);
     }
     if(cod==2)
     {
        fin >> y;
        v[poz2[y]]=v[n2];
        n2--;
        CoborareStergere(poz2[y]);
        Urcare(poz2[y]);
     }
     if(cod==3) fout << X[v[1]]<<"\n";
  }
    return 0;
}