Pagini recente » Cod sursa (job #2562475) | Cod sursa (job #355435) | Cod sursa (job #3227240) | Cod sursa (job #1164287) | Cod sursa (job #2643106)
#include <fstream>
#include <climits>
using namespace std;
const int NMAX = 200000;
int l_heap;
int heap[1 + NMAX];
int nr;
int vec[1 + NMAX];
int poz[1 + NMAX];
void schimb(int poz_a, int poz_b)
{
swap(poz[heap[poz_a]], poz[heap[poz_b]]);
swap(heap[poz_a], heap[poz_b]);
}
void bubble_up(int poz_heap)
{
int poz_parinte = poz_heap / 2;
while (poz_parinte != 0 && vec[heap[poz_parinte]] > vec[heap[poz_heap]])
{
schimb(poz_parinte, poz_heap);
poz_heap = poz_parinte;
poz_parinte = poz_heap / 2;
}
}
void bubble_down(int poz_heap)
{
int poz_fiu_1 = 2 * poz_heap;
int poz_fiu_2 = 2 * poz_heap + 1;
while ((poz_fiu_1 <= l_heap && vec[heap[poz_fiu_1]] < vec[heap[poz_heap]]) ||
(poz_fiu_2 <= l_heap && vec[heap[poz_fiu_2]] < vec[heap[poz_heap]]))
{
if (vec[heap[poz_fiu_1]] < vec[heap[poz_fiu_2]])
{
schimb(poz_fiu_1, poz_heap);
poz_heap = poz_fiu_1;
}
else
{
schimb(poz_fiu_2, poz_heap);
poz_heap = poz_fiu_2;
}
poz_fiu_1 = 2 * poz_heap;
poz_fiu_2 = 2 * poz_heap + 1;
}
}
void adaugare(int element)
{
nr++;
vec[nr] = element;
l_heap++;
heap[l_heap] = nr;
poz[nr] = l_heap;
bubble_up(l_heap);
}
void eliminare(int index)
{
int last = heap[l_heap];
schimb(poz[index], l_heap);
vec[index] = INT_MAX;
l_heap--;
bubble_up(poz[last]);
bubble_down(poz[last]);
}
int main()
{
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int n, op, element, index;
in >> n;
for (int i = 1; i <= n; i++)
{
in >> op;
switch (op)
{
case 1:
{
in >> element;
adaugare(element);
break;
}
case 2:
{
in >> index;
eliminare(index);
break;
}
case 3:
{
out << vec[heap[1]] << '\n';
break;
}
}
/*
for (int j = 1; j <= nr; j++)
out << vec[j]<<' ';
out << '\n';
for (int j = 1; j <= nr; j++)
out << poz[j]<<' ';
out << '\n';
for (int j = 1; j <= l_heap; j++)
out << heap[j]<<' ';
out << '\n';
out << '\n';
*/
}
return 0;
}