Cod sursa(job #2541842)

Utilizator flee123Flee Bringa flee123 Data 8 februarie 2020 23:34:33
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <bits/stdc++.h>
#define nmax 400005
using namespace std;

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

struct dubla{
    int valoare, indice_adaugare;
}heap[nmax];
int heap_size;
int pozitie_in_heap[nmax];
vector <int> numere_adaugate;

void create_heap()
{
    int i;
    heap[0].valoare = -1;
    for(i = 1; i < nmax; i++)
        heap[i].valoare = 2000000000;
}

void adaugare_element(dubla element)
{
    heap_size++;
    int pos1 = heap_size, pos2 = (heap_size >> 1);
    heap[heap_size] = element;
    pozitie_in_heap[element.indice_adaugare] = pos1;
    while(heap[pos1].valoare < heap[pos2].valoare)
    {
        pozitie_in_heap[heap[pos1].indice_adaugare] = pos2;
        pozitie_in_heap[heap[pos2].indice_adaugare] = pos1;
        swap(heap[pos1], heap[pos2]);
        pos1 = pos2;
        pos2 = (pos2 >> 1);
    }
}

void coborare(int pos1)
{
    int pos2 = (pos1 << 1);
    if(heap[pos2].valoare > heap[pos2 + 1].valoare)
        ++pos2;
    if(heap[pos1].valoare > heap[pos2].valoare)
    {
        pozitie_in_heap[heap[pos1].indice_adaugare] = pos2;
        pozitie_in_heap[heap[pos2].indice_adaugare] = pos1;
        swap(heap[pos1], heap[pos2]);
        coborare(pos2);
    }
}

void stergere_element(int pozitie)
{
    heap[pozitie] = heap[heap_size];
    heap[heap_size].valoare = 2000000000;
    heap_size--;
    pozitie_in_heap[heap[pozitie].indice_adaugare] = pozitie;
    coborare(pozitie);
}

int main()
{
    int i, operatie, x, j = 1, k, l;
    dubla sclav;
    heap_size = 0;
    create_heap();
    fin >> k;
    for(i = 0; i < k; i++)
    {
        fin >> operatie;
        if(operatie == 3)
            fout << heap[1].valoare << '\n';
        else
        fin >> x;
        if(operatie == 1)
        {
            sclav.indice_adaugare = j;
            j++;
            sclav.valoare = x;
            adaugare_element(sclav);
        }
        else if (operatie == 2)
            stergere_element(pozitie_in_heap[x]);
    }

    return 0;
}