Pagini recente » Cod sursa (job #1572231) | Cod sursa (job #983509) | Istoria paginii info-oltenia-2019/individual/7-8 | Cod sursa (job #2631148) | Cod sursa (job #2610570)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
const int Max=200005;
int n,heap[Max],el[Max],poz[Max],m,op,l,nr,x;
void add(int x)
{
heap[++l]=++nr;
poz[nr]=l;
el[nr]=x;
int val=l;
while(val/2 && el[heap[val]]<el[heap[val/2]])
{
swap(heap[val],heap[val/2]); swap(poz[heap[val/2]],poz[heap[val]]);
val/=2;
}
}
void del(int pz)
{
swap(heap[pz],heap[l]); swap(poz[heap[pz]],poz[heap[l]]); l--;
bool isheap=0;
while(pz*2<=l && !isheap)
{
if(2*pz+1<=l)
{
int mx=2*pz;
if(el[heap[mx]]>el[heap[mx+1]])
mx++;
if(el[heap[pz]]>el[heap[mx]])
{
swap(heap[pz],heap[mx]); swap(poz[heap[pz]],poz[heap[mx]]);
pz=mx;
}
else
isheap=1;
}
else if(el[heap[pz]]>el[heap[2*pz]])
{
swap(heap[pz],heap[2*pz]); swap(poz[heap[pz]],poz[heap[2*pz]]); pz=2*pz;
}
else
isheap=1;
}
}
void citire()
{
in>>n;
for(int i=1;i<=n;i++)
{
in>>op;
if(op==1 || op==2)
in>>x;
if(op==1)
add(x);
else if(op==2)
del(poz[x]);
else
out<<el[heap[1]]<<"\n";
}
}
int main()
{
citire();
return 0;
}