Cod sursa(job #1577159)

Utilizator iulian_f2kGuraliuc Iulian iulian_f2k Data 23 ianuarie 2016 11:53:57
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
#include <iostream>//   MinHeap
#include <fstream>
#define DMAX 200005
using namespace std;
int n, poz[DMAX], timp, nrop;
struct elem{
int inf,nr;
}H[DMAX],nod;

void inserare(int inf);
void creare_inserare();
void combinare(int i);
void creare_combinari();
int extrageMinim();
void heapsort();

void read();
void write();
int main()
{
    freopen("heapuri.in","rt",stdin);
    freopen("heapuri.out","wt",stdout);
    //creare_combinari();
    read();
    //write();
    //cout<<extrageMinim();
}
void read()
{
    int x,op;
    scanf("%d", &nrop);
    for(int i=1;i<=nrop;i++)
    {
        scanf("%d", &op);
        if(op==1){
            scanf("%d", &x);
            inserare(x);
        }else if(op==3)
            cout<<H[1].inf<<'\n';
            else
            {
                scanf("%d", &x);
                //nod=H[poz[x]];
                H[poz[x]]=H[n--];
                //poz[H[poz[x]].nr]=poz[H[n].nr];
                combinare(poz[x]);
            }
    }
}

void inserare(int inf)
{
    int fiu, tata;
    fiu=++n;
    tata=fiu/2;
    while(tata>0 && H[tata].inf>inf)
    {
        H[fiu]=H[tata];
        poz[H[tata].nr]=fiu;
        fiu=tata;
        tata=tata/2;
    }
    H[fiu].inf=inf;
    H[fiu].nr=++timp;
    poz[timp]=fiu;
}
/*
void creare_inserare()
{
    int nr, x;
    scanf("%d", &nr);
    for(int i=1;i<=nr;i++)
    {
        scanf("%d", &x);
        inserare(x);
    }
}*/

void combinare(int i)
{
    int inf=H[i].inf;//nodul care vreau sa fie radacina
    int t=H[i].nr;
    int tata=i;
    int fiu=2*i;
    while(fiu<=n){
        if(fiu+1<=n && H[fiu].inf>H[fiu+1].inf) fiu++;  //det. cel mai mic dintre fii
        if(H[fiu].inf<=inf)//informatia
        {//promovez pe cel mai mic dintre fii
            H[tata]=H[fiu];
            poz[H[fiu].nr]=tata;
            tata=fiu;
            fiu=2*tata;
        }
        else    // am gasit locul potrivit
            break;
    }
    H[tata].inf=inf;
    H[tata].nr=t;
    poz[t]=tata;
}
/*
void creare_combinari()
{
    scanf("%d", &n);
    for(int i=1;i<=n;i++)
        scanf("%d", &H[i]);
    for(int i=n/2; i>0; i--)//nodurile de la i la n nu au fii deci sunt heap-uri corecte
        combinare(i);
}

void write()
{
    for(int i=1;i<=n;i++)
        cout<<H[i]<<' ';
    cout<<'\n';
}

int extrageMinim()
{
    int x=H[1].inf;
    H[1]=H[n--];
    combinare(1);
    return x;
}*/