Cod sursa(job #2955204)

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

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int nrop,poz,n,cnt,x,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);
int main()
{
    int i,ind,op;
    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';
        }

    }
    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=H[i];
    int tata=i,fiu=2*i;
    while(fiu<=n)
    {
        if(fiu+1<=n && H[fiu+1]<H[fiu])
            fiu++;
        if(x<=H[fiu])
            break;
        else
        {
            H[tata]=H[fiu];
            tata=fiu;
            fiu=2*fiu;
        }
    }
    H[tata]=x;
}