Pagini recente » Cod sursa (job #583580) | Cod sursa (job #1402580) | Cod sursa (job #2769990) | Cod sursa (job #979590) | Cod sursa (job #2896387)
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
vector<int> heap(200010); // heap[i] = indicele corespunzator valorii din v
vector<int> valori(200010); // valorile in ordinea citirii
vector<int> pozitie(200010); // pozitie[i] = pozitia in heap a valorii v[i]
int nr_valori, nr_heap; // numarul de elemente respective
void urca(int nod)
{
while (valori[heap[nod]] < valori[heap[nod / 2]])
{
swap(heap[nod], heap[nod / 2]);
pozitie[heap[nod]] = nod;
pozitie[heap[nod / 2]] = nod / 2;
nod /= 2;
}
}
void coboara(int nod)
{
int nod_copy = -1;
while (nod_copy != nod)
{
nod_copy = nod;
if (nod_copy * 2 <= nr_heap && valori[heap[nod_copy]] > valori[heap[nod_copy * 2]])
nod = nod_copy * 2;
if (nod * 2 + 1 <= nr_heap && valori[heap[nod]] > valori[heap[nod * 2 + 1]])
nod = nod_copy * 2 + 1;
if (nod_copy != nod)
{
swap(heap[nod], heap[nod_copy]);
pozitie[heap[nod]] = nod;
pozitie[heap[nod_copy]] = nod_copy;
}
}
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int tip_operatie, valoare, nr_operatii, ordine;
f >> nr_operatii;
for (int i = 0; i < nr_operatii; i++)
{
f >> tip_operatie;
if (tip_operatie == 1)
{
f >> valoare;
nr_heap++;
nr_valori++;
valori[nr_valori] = valoare;
pozitie[nr_valori] = nr_valori;
heap[nr_heap] = nr_valori;
urca(nr_heap); // ajustam elementul introdus in heap pe ultima pozitie
}
else if (tip_operatie == 2)
{
f >> ordine;
heap[pozitie[ordine]] = heap[nr_heap]; // inlocuim ultimul element din heap cu al k-lea element citit
pozitie[heap[nr_heap]] = pozitie[ordine];
nr_heap--;
urca(pozitie[ordine]); // reparam heap ul
coboara(pozitie[ordine]);
}
else if (tip_operatie == 3)
{
g << valori[heap[1]] << "\n";
}
}
}