Cod sursa(job #2892187)

Utilizator neagamariaMaria Neaga-Budoiu neagamaria Data 21 aprilie 2022 10:53:29
Problema Heapuri Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int heap[200001], poz[200001], elpoz[1000001];
//elpoz = ordinea adaugarii elementelor
//poz = pozitia elementelor in heap

void schimbare(int p1, int p2)
{
    //interschimbare elemente
    int aux = heap[p1];
    heap[p1] = heap[p2];
    heap[p2] = aux;

    //actualizare pozitii
    poz[heap[p1]] = p1;
    poz[heap[p2]] = p2;
}

void inserare(int pozitie, int nr)
{
    heap[pozitie] = nr;
    poz[nr] = pozitie;

    // mut element in heap astfel: e mai mic decat tatal, fac schimb intre ele
    while(pozitie/2 >= 0 && heap[pozitie] < heap[pozitie/2])
    {
        schimbare(pozitie, pozitie/2);
        pozitie = pozitie/2;
    }
}

void stergere(int nelem, int pozitie)
{
    schimbare(pozitie, nelem-1);
    nelem--;

    while(pozitie * 2 <= nelem-1)
    {
        int c1=pozitie *2;
        if(pozitie * 2 + 1 <= nelem-1)
        {
            int c2 = pozitie * 2 +1;

            if(heap[pozitie] < heap[c1] && heap[pozitie] < heap[c2])
                break;

            if(heap[c1] <= heap[c2])
            {
                schimbare(pozitie, c1);
                pozitie = c1;
            }
            else
            {
                schimbare(pozitie, c2);
                pozitie = c2;
            }
        }
        else
        {
            if(heap[pozitie] <= heap[c1])
                break;

            schimbare(pozitie, c1);
            pozitie = c1;
        }
    }
}

int main()
{
    int n, op, crt, nelem = 0, m = 0;
    in>>n;

    for(int i=0; i<n; i++)
    {
        in>>op;

        switch(op)
        {
            case 1:
                in>>crt;
                elpoz[nelem] = crt;
                inserare(nelem, crt);
                nelem++;
                break;
            case 2:
                in>>crt;
                stergere(nelem, poz[elpoz[crt-1]]);
                nelem--;
                break;
            default:
                out<<heap[0]<<endl;
                break;
        }
    }

    return 0;
}