Cod sursa(job #2083317)

Utilizator nic_irinaChitu Irina nic_irina Data 7 decembrie 2017 15:40:28
Problema Heapuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("heapuri.in");
ofstream fout("heapuri.out");

int viz[200001];

struct nod
{
    int val, ind;
}v[200001];

int left( int i )
{
    return 2*i;
}

int right(int i)
{
    return 2*i +1;
}

int parinte(int i)
{
    return i/2;
}

void down_heap(int x, int heap_size)
{
    int son;
    do
    {
        son = 0;
        if(left(x) <= heap_size)
        {
            son = left(x);
            if(right(x) <= heap_size && v[right(x)].val<v[left(x)].val)
                son = right(x);
            if(v[son].val >= v[x].val)
                son = 0;
        }
        if(son)
        {
            swap(v[x], v[son]);
            x=son;
        }
    }while(son);
}

void up_heap(int x)
{
    nod key = v[x];
    while((x > 1) && (key.val < v[parinte(x)].val))
    {
        v[x] = v[parinte(x)];
        x = parinte(x);
    }
    v[x] = key;
}

void del(int x, int &heap_size)
{
    v[x] = v[heap_size];
    heap_size--;
    down_heap(x, heap_size);
}

int main()
{
    int n, indice=0, op, elem, heap_size=0, i;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>op;
        if(op == 1)
        {
            fin>>elem;
            heap_size++;
            indice++;
            v[heap_size].val = elem;
            v[heap_size].ind = indice;
            up_heap(heap_size);
        }
        if(op == 2)
        {
            fin>>elem;
            viz[elem] = 1;
            //in viz marchez ce trebuie sters insa abia cand trebuie sa afisez minimul
            //atunci sterg pana ajung la un viz[]0
        }
        if(op == 3)
        {
            while ( viz [v[1].ind] == 1)
            //cat timp viz[ minim] este 1 inseamna ca trebuie sterse
            //si primul nevizitat inseamna ca e minimul care nu ar fi trebuit sa fie sters
                del(1, heap_size);
            fout<<v[1].val<<'\n';
        }
    }
}