Cod sursa(job #1980721)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 13 mai 2017 21:40:03
Problema Heapuri Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdint.h>
#include <fstream>
#include <stdlib.h>
#define nmax 200001
using namespace std;
fstream f1("heapuri.in", ios::in);
fstream f2("heapuri.out", ios::out);
int32_t n, pz[nmax], nrelh;
struct heap
{
    int32_t val;
    int32_t nrord;
}h[nmax];
///n= nr operatii
///nrelh= numar elemente heap
///h= heapul
///poz[i]= pozitia pe care se afla in heap al i-lea element introdus
void insereaza(int32_t val, int32_t ord)
{
    nrelh++;
    int32_t tata=nrelh/2, fiu=nrelh;

    while((tata!=0)&&(h[tata]. val>val))
    {
        h[fiu]=h[tata];
        pz[h[tata].nrord]=fiu;

        fiu=tata;
        tata/=2;
    }

    h[fiu].val=val;
    h[fiu].nrord=ord;
    pz[ord]=fiu;
}
void sterge(int32_t poz)
{
    //stergi elementul cu pozitia poz din heap
    int32_t val, ord;
    h[poz].val=h[nrelh].val;
    ord=h[nrelh].nrord;
    val=h[poz].val;
    pz[ord]=poz;

    nrelh--;

    ///cobori cat este nevoie nodul poz
    int32_t tata=poz, fiu=poz*2, mos;
    if((nrelh>=poz*2+1)&&(h[poz*2+1].val < h[poz*2].val)) fiu++;

    while((fiu<=nrelh)&&(val> h[fiu].val))
    {
        h[tata]=h[fiu];
        pz[h[fiu].nrord]=tata;

        tata=fiu;
        fiu*=2;
        if((nrelh>=poz*2+1)&&(h[poz*2+1].val < h[poz*2].val)) fiu++;
    }

    h[tata].val=val;
    h[tata].nrord=ord;
    pz[ord]=tata;

    ///urci daca e nevoie nodul din pozitia tata
    mos=tata/2;
    while((mos!=0)&&(val< h[mos].val))
    {
        h[tata]=h[mos];
        pz[h[mos].nrord]= tata;
        tata=mos;
        mos/=2;
    }
    h[tata].val=val;
    h[tata].nrord=ord;
    pz[ord]=tata;
}
int main()
{
    int32_t i, x, nrord=0;
    int16_t op;
    f1>>n;
    for(i=1; i<=n; i++)
    {
        f1>>op;
        if(op==1)
        {
            f1>>x;
            nrord++;
            insereaza(x, nrord);
            ///nrord= numarul de ordine al elementului x
        }
        else if(op==2)
        {
            f1>>x;
            sterge(pz[x]);
        }
        else
        {
            f2<<h[1].val<<"\n";///afisezi minimul curent
        }
    }
    return 0;
}