Pagini recente » Cod sursa (job #835879) | Cod sursa (job #1433049) | Cod sursa (job #1262117) | Cod sursa (job #907804) | Cod sursa (job #2952943)
#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 parm)
{
int elem = position[parm];
if (elem < 0) return;
heap[elem] = heap[n];
position[heap[elem]] = position[heap[n]];
n--;
position[parm] = -1;
// 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;
}