Pagini recente » Cod sursa (job #1205163) | Cod sursa (job #900706) | Cod sursa (job #1363829) | Cod sursa (job #577806) | Cod sursa (job #1694962)
#include <fstream>
using namespace std;
const int MAXN = 200100;
int heap[MAXN], in_heap[MAXN], v[MAXN];
int heap_size = 0;
void swapValues(int i, int j)
{
swap(heap[i], heap[j]);
in_heap[heap[i]] = i;
in_heap[heap[j]] = j;
}
void addHeap(int x)
{
heap[++heap_size] = x;
in_heap[x] = heap_size;
int i = heap_size;
while (v[heap[i]] < v[heap[(i>>1)]] && i > 1)
{
swapValues(i, (i>>1));
i = (i>>1);
}
}
void delHeap(int x)
{
int i = in_heap[x];
heap[i] = heap[heap_size--];
in_heap[heap[i]] = i;
in_heap[x] = 0;
while (1)
{
int vmin = i;
if ((i<<1) <= heap_size && v[heap[(i<<1)]] < v[heap[vmin]])
vmin = (i<<1);
if ((i<<1)+1 <= heap_size && v[heap[(i<<1)+1]] < v[heap[vmin]])
vmin = (i<<1)+1;
if (vmin != i)
{
swapValues(i, vmin);
i = vmin;
}
else
break;
}
}
int main()
{
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int n;
in >> n;
int t, x;
int m = 0;
for (int i = 1; i <= n; i++)
{
in >> t;
if (t == 1)
{
in >> x;
v[++m] = x;
addHeap(m);
}
else if (t == 2)
{
in >> x;
delHeap(x);
}
else if (t == 3)
{
out << v[heap[1]] << '\n';
}
}
return 0;
}