Pagini recente » Cod sursa (job #36446) | Cod sursa (job #2625928) | Cod sursa (job #2040202) | Cod sursa (job #1062548) | Cod sursa (job #1536713)
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
long long n,x,operatie,p=1;
long long heap[200005],pozitie[200005],ordine[100000000];
void sift(long long heap[],long long &inaltime,long long k)
{
long long fiu,aux;
do{
fiu=0;
if(2*k <= inaltime)
{
fiu=2*k;
if(2*k+1 <= inaltime && heap[2*k+1]<heap[2*k]) fiu=2*k+1;
if(heap[fiu] >= heap[k]) fiu=0;
}
if(fiu){
pozitie[heap[fiu]]=k;
pozitie[heap[k]]=fiu;
aux=heap[k];
heap[k]=heap[fiu];
heap[fiu]=aux;
}
}while(fiu);
return;
}
void fa_heap(long long heap[],long long &inaltime,long long k)
{
long long cheie=heap[k];
while((k>1) && (cheie<heap[k/2]))
{
heap[k]=heap[k/2];
pozitie[heap[k/2]]=k;
k=k/2;
}
pozitie[cheie]=k;
heap[k]=cheie;
return;
}
void inserare_heap(long long heap[],long long &inaltime,long long x)
{
inaltime++;
heap[inaltime]=x;
ordine[p]=x;
p++;
pozitie[x]=inaltime;
fa_heap(heap,inaltime,inaltime);
return;
}
void stergere_heap(long long heap[],long long &inaltime,long long poz)
{
heap[poz]=heap[inaltime];
inaltime--;
if(poz>1 && heap[poz]<heap[poz/2]) fa_heap(heap,inaltime,poz);
else sift(heap,inaltime,poz);
return;
}
int main()
{
long long i,inaltime,k=1,j;
in>>n;
inaltime=0;
for(i=1;i<=n;i++)
{
in>>operatie;
if(operatie==1)
{
in>>x;
inserare_heap(heap,inaltime,x);
}
if(operatie==2)
{
in>>x;
if(inaltime>0) stergere_heap(heap,inaltime,pozitie[ordine[x]]);
}
if(operatie==3)
{
out<<heap[1]<<"\n";
}
}
in.close();
out.close();
return 0;
}