Cod sursa(job #3174982)

Utilizator BreabanDanielBreaban Daniel-Vasile BreabanDaniel Data 25 noiembrie 2023 11:14:57
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 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;
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)
        {
            pozi[++n]=++contor;
            fin>>H[n];
        }
        else
        if(q==3)
        {
            creare_combinare();
            fout<<H[1]<<'\n';
        }
        else
        if(q==2)
        {
            fin>>aux;
            if(pozi[aux]!=aux)
                for(int i=1;i<=n;i++)
                {
                    if(pozi[i]==aux)
                    {
                        aux=i;
                        break;
                    }
                }
            pozi[aux]=pozi[n];
            H[aux]=H[n--];

        }
    }

    return 0;
}
void creare_inserare()
{
    int x,nn;
    fin>>nn;
    for(int i=1;i<=nn;i++)
    {
        fin>>x;
        inserare(x);
    }
}
void afisare()
{
    for(int i=1;i<=n;i++)
        fout<<H[i]<<' ';
}
void inserare(int x)
{
    int fiu,tata;
    fiu=n+1;
    tata=fiu/2;
    while(tata>0 && H[tata]>x)
    {
        H[fiu]=H[tata];
        tata=fiu/2;
    }
    H[fiu]=x;
}
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;
    x=H[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)
        {
            pozi[tata]=pozi[fiu];
            H[tata]=H[fiu];
            tata=fiu;
            fiu=2*tata;
        }
        else
            break;
    }
    H[tata]=x;
    pozi[tata]=pozx;
}
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