Cod sursa(job #3175555)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 25 noiembrie 2023 23:25:17
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#define NMAX 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
///min heap
int n,H[NMAX],t,q,pozi[NMAX],contor,aux,p[NMAX],aux1,x;
void combinare(int poz);
void creare_combinare();
int ExtrageMin();
void afisare();
void creare_inserare();
void inserare(int x);
int main()
{
    fin>>t;
    while(t--)
    {
        fin>>q;
        if(q==1)
        {
            fin>>x;
            pozi[n+1]=++contor;
            p[contor]=n+1;
            inserare(x);
        }
        else
        if(q==3)
        {
            fout<<H[1]<<'\n';
        }
        else
        if(q==2)
        {
            fin>>aux;
            aux1=p[aux];
            p[pozi[n]]=aux1;
            pozi[aux1]=pozi[n];
            H[aux1]=H[n--];
            combinare(aux1);

        }
    }

    return 0;
}

void inserare(int x)
{
    int fiu,tata,pozx;
    pozx=pozi[n+1];
    fiu=++n;
    tata=fiu/2;
    while(tata>0 && H[tata]>x)
    {
        H[fiu]=H[tata];
        p[pozi[tata]]=fiu;
        pozi[fiu]=pozi[tata];
        fiu=tata;
        tata=fiu/2;
    }
    H[fiu]=x;
    pozi[fiu]=pozx;
    p[pozx]=fiu;
}
void combinare(int poz)
/// se combina nodul de pe poz cu minheapurile corecte cu radacinile in 2poz si 2poz+1
{
    int tata,fiu,x,pozx,px;
    x=H[poz];
 //   px=p[pozi[poz]]
    pozx=pozi[poz];
    tata=poz;
    fiu=2*tata;
    while(fiu<=n)
    {
        if(fiu+1<=n && H[fiu+1]<H[fiu])
            fiu++;
        if(H[fiu]<x)
        {
            p[pozi[fiu]]=tata;
            pozi[tata]=pozi[fiu];
            H[tata]=H[fiu];
            tata=fiu;
            fiu=2*tata;
        }
        else
            break;
    }
    H[tata]=x;
    pozi[tata]=pozx;
    p[pozx]=tata;
}
void creare_combinare()
{
    for(int i=n/2;i>0;i--)
        combinare(i);
}
int ExtrageMin()
{
    int minim=H[1];
  //  H[1]=H[n--];
   // combinare(1);
    return minim;
}
///poz[i] poz pe care se afla in heap al i lea element in heap