Pagini recente » Cod sursa (job #1320782) | Cod sursa (job #944214) | Cod sursa (job #1452970) | Cod sursa (job #2718586) | Cod sursa (job #1460702)
#include <fstream>
using namespace std;
ofstream fout("heapuri.out");
ifstream fin("heapuri.in");
const int NMAX = 200005;
int n, cod, x, lg, nr;
int v[NMAX], poz[NMAX], Heap[NMAX];
void hswap(int nod1, int nod2);
int left_son(int nod) { return nod * 2; }
int right_son(int nod) { return nod * 2 + 1; }
int father(int nod) { return nod / 2; }
void sift(int nod)
{
int son = 1;
while(son) {
son = 0;
if(left_son(nod) <= lg) {
son = left_son(nod);
if( right_son(nod) <= lg && v[Heap[right_son(nod)]] < v[Heap[son]] )
son = right_son(nod);
if( v[Heap[right_son(nod)]] > v[Heap[nod]] && v[Heap[left_son(nod)]] > v[Heap[nod]] )
son = 0;
}
if(son) {
hswap(son, nod);
nod = son;
}
}
}
void percolate(int nod)
{
while((nod > 1) && (v[Heap[nod]] < v[Heap[father(nod)]]) ) {
hswap(nod, father(nod));
nod = father(nod);
}
}
void hswap(int nod1, int nod2)
{
swap(Heap[nod1], Heap[nod2]);
swap(poz[Heap[nod1]], poz[Heap[nod2]]);
}
void add_node(int val)
{
v[++nr] = val;
Heap[++lg] = nr;
poz[nr] = lg;
percolate(lg);
}
void delete_node(int val)
{
hswap(val, lg);
lg--;
sift(val);
}
int main()
{
fin >> n;
for(int i=1; i<=n; i++)
{
fin >> cod;
switch(cod)
{
case 1: { fin >> x; add_node(x); break; }
case 2: { fin >> x; delete_node(poz[x]); break; }
case 3: { fout << v[Heap[1]] << '\n'; break; }
}
}
return 0;
}