Cod sursa(job #2553827)

Utilizator andaraluca2001Anda Epure andaraluca2001 Data 22 februarie 2020 12:12:39
Problema Heapuri Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int MAX=200001;
int h[MAX],poz[MAX],nh,nrop,cod,val,v[MAX],n;
void schimb(int p, int q)
{
   swap(h[p],h[q]);
   poz[h[p]]=p;
   poz[h[q]]=q;

}

void urca(int p)
{
    while(p>1 && v[h[p]]<v[h[p/2]])
    {
        schimb(p,p/2);
        p/=2;

    }

}

void adauga(int x)
{
    h[++nh]=x;
    poz[x]=nh;
    urca(nh);

}

void coboara(int p)
{
     int fs=2*p,fd=2*p+1,bun=p;
     if(fs<=nh && v[h[fs]]<v[h[bun]]) bun=fs;
     if(fd<=nh && v[h[fd]]<v[h[bun]]) bun=fd;
     if(bun!=p)
     {
         schimb(p,bun);
         coboara(bun);
     }

}

void sterge(int p)
{
   schimb(p,nh--);
   urca(p);
   coboara(p);
}
int main()
{
     in>>nrop;
     for(int i=1;i<=nrop;i++)
     {
        in>>cod;
       if(cod==1)

       {
          in>>v[++n];
          adauga(n);
       }
       if(cod==2)
       {

          in>>val;
          sterge(poz[val]);
       }
       if(cod==3)

       {
          out<<v[h[1]]<<"\n";
       }

     }
    return 0;
}