Pagini recente » Cod sursa (job #2428084) | Cod sursa (job #241587) | Cod sursa (job #1514943) | Cod sursa (job #714914) | Cod sursa (job #2952940)
#include <bits/stdc++.h>
using namespace std;
//MINHEAP
constexpr int NMAX = 200002;
ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");
int heap[NMAX], position[NMAX], arr[NMAX], n;
int get_elem(int i)
{
return arr[heap[i]];
}
int insert_element(int elem)
{
arr[n + 1] = elem;
int pos = n + 1, tpos = pos / 2;
while (tpos != 0 && get_elem(tpos) > elem)
{
heap[pos] = heap[tpos];
position[heap[tpos]] = pos;
pos = tpos;
tpos = pos / 2;
}
heap[pos] = n + 1;
position[heap[pos]] = pos;
n++;
}
int get_min()
{
return get_elem(1);
}
void erase_element(int elem)
{
elem = position[elem];
heap[elem] = heap[n];
position[heap[elem]] = position[heap[n]];
n--;
// combine
int x = get_elem(elem), par = elem, chi = par * 2;
while (par <= n)
{
if (chi + 1 <= n && get_elem(chi + 1) < get_elem(chi)) chi++;
if (get_elem(chi) < x)
{
heap[par] = heap[chi];
position[heap[chi]] = chi;
par = chi;
chi = par * 2;
}
else
{
break;
}
}
heap[par] = elem;
position[elem] = par;
}
int main()
{
int nops;
fin >> nops;
while (nops)
{
nops--;
int op, parm;
fin >> op;
if (op != 3) fin >> parm;
if (op == 1)
{
insert_element(parm);
}
else if (op == 2)
{
erase_element(parm);
}
else if (op == 3)
{
fout << get_min() << '\n';
}
}
return 0;
}