Cod sursa(job #2892524)

Utilizator neagamariaMaria Neaga-Budoiu neagamaria Data 22 aprilie 2022 14:40:31
Problema Heapuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct elem
{
    int val;
    int init;
    int crt;
};

elem h[200001], poz[200001];
int n, op, crt, nr=0, m=0;

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

    //schimbare pozitii curente
    h[p1].crt=poz[h[p1].init].crt=p1;
    h[p2].crt=poz[h[p2].init].crt=p2;
}

void inserare(elem nou)
{
    int pozitie=nou.crt;
    h[pozitie]=nou;
    poz[nou.init]=nou;

    while(pozitie/2>=0 && h[pozitie].val<h[pozitie/2].val)
    {
        schimbare(pozitie, pozitie/2);
        pozitie=pozitie/2;
    }
}

void stergere(int nr, elem e)
{
    int pozitie=e.crt;

    schimbare(pozitie, nr-1);
    nr--;

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

            if(h[pozitie].val<h[c1].val && h[pozitie].val<h[c2].val)
                break;

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

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

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

        switch(op)
        {
            case 1:
                in>>crt;
                elem nou;
                nou.val=crt;
                nou.init=m;
                nou.crt=nr;
                inserare(nou);
                nr++;
                m++;
                break;
            case 2:
                in>>crt;
                stergere(nr, poz[crt-1]);
                nr--;
                break;
            default:
                out<<h[0].val<<'\n';
                break;
        }
    }

    return 0;
}