Cod sursa(job #2955223)

Utilizator emiliamariamihut@gmail.comMihut Emilia [email protected] Data 16 decembrie 2022 16:27:25
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#define NMAX 200002
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int nrop,n,cnt,a[NMAX],p[NMAX],H[NMAX];///p[i]=pozitia celui de al i lea element citit in heap

void inserare(int x,int &n);
void combinare (int i);
void afisare();
int main()
{
    int i,ind,op,x,poz;
    fin>>nrop;
    for(i=1; i<=nrop; i++)
    {
        fin>>op;
        if(op==1)
        {
            fin>>x;
            inserare(x,n);
            a[n]=x;

        }
        else if(op==2)
        {
            fin>>ind;
            poz=p[ind];
            H[poz]=H[n];
            p[H[n]]=poz;
            n--;
           combinare(poz);
        }
        else if(op==3)
           fout<<a[H[1]]<<'\n';
        //afisare();
    }
    return 0;
}
void inserare(int x,int &n)
{
    int poz=n+1;
    int tpoz=poz/2;
    while(tpoz>0 && a[H[tpoz]]>x)
    {
        H[poz]=H[tpoz];
        p[H[tpoz]]=poz;
        poz=tpoz;
        tpoz=poz/2;
    }
    n++;
    H[poz]=n;
    p[n]=poz;

}
void combinare (int i)
{
    int x=a[H[i]],cine=H[i];
    int tata=i,fiu=2*i;
    while(fiu<=n)
    {
        if(fiu+1<=n && a[H[fiu+1]]<a[H[fiu]])
            fiu++;
        if(x<=a[H[fiu]])
            break;
        else
        {
            H[tata]=H[fiu];
            p[H[fiu]]=tata;
            tata=fiu;
            fiu=2*fiu;
        }
    }
    H[tata]=cine;
    p[cine]=tata;
}
void afisare()
{
    int i;
    for(i=1; i<=n; i++)
        fout<<H[i]<<' ';
    fout<<'\n';
}