Pagini recente » Cod sursa (job #1331096) | Cod sursa (job #100180) | Cod sursa (job #1718617) | Cod sursa (job #2116539) | Cod sursa (job #1004526)
#include <cstdio>
#include <algorithm>
#define SIZE 200001
using namespace std;
int n, nr, x, op, i, nr_heap, heap[SIZE], pos[SIZE], val[SIZE];
inline int father(int node)
{
return node/2;
}
inline int left_son(int node)
{
return 2*node;
}
inline int right_son(int node)
{
return 2*node+1;
}
inline void percolate(int node)
{
while(node>1 && val[ heap[node] ] < val[heap[father(node)]])
{
swap( pos[heap[node]], pos[heap[father(node)]]);
swap( heap[node], heap[father(node)] );
node = father(node);
}
}
inline void sift(int node)
{
int son;
son = node;
if(left_son(node) <= nr_heap)
{
son=left_son(node);
if(right_son(node) <= nr_heap && val[ heap[son] ] > val[ heap[right_son(node) ] ])
son=right_son(node);
}
if( son!=node )
{
swap(pos[ heap[son] ], pos[ heap[node] ]);
swap(heap[son], heap[node]);
sift(son);
}
}
inline void remove_elem(int &nr_heap, int node)
{
swap(pos[ heap[nr_heap] ], pos[ heap[node] ]);
swap(heap[nr_heap], heap[node]);
--nr_heap;
sift(node);
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &n);
for(i=1;i<=n;++i)
{
scanf("%d", &op);
if(op==1 || op==2)
{
scanf("%d", &x);
if(op==1)
{
val[++nr] = x; // al nr-lea elem din heap are cheia x
heap[++nr_heap] = nr;
pos[nr] = nr_heap; // pozitia in heap al elementului intrat al nr-lea
percolate(nr_heap);
}
else
remove_elem(nr_heap, pos[x]);
}
else
printf("%d\n", val[heap[1]]);
}
return 0;
}