Pagini recente » Cod sursa (job #1307398) | Cod sursa (job #1133720) | Cod sursa (job #1142155) | Cod sursa (job #543852) | Cod sursa (job #1536706)
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int n,x,operatie,p=1;
int heap[200005],pozitie[200005],ordine[200005];
void sift(int heap[],int &inaltime,int k)
{
int 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(int heap[],int &inaltime,int k)
{
int 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(int heap[],int &inaltime,int x)
{
inaltime++;
heap[inaltime]=x;
ordine[p]=x;
p++;
pozitie[x]=inaltime;
fa_heap(heap,inaltime,inaltime);
return;
}
void stergere_heap(int heap[],int &inaltime,int poz)
{
//out<<"Elimin elementul "<<heap[poz]<<" Si initial il inlocuiesc cu: "<<heap[inaltime]<<"\n";
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()
{
int i,inaltime,k=1,j;
in>>n;
inaltime=0;
for(i=1;i<=n;i++)
{
in>>operatie;
if(operatie==1)
{
in>>x;
//out<<"Inserez elementul: "<<x<<"\n";
inserare_heap(heap,inaltime,x);
}
if(operatie==2)
{
in>>x;
stergere_heap(heap,inaltime,pozitie[ordine[x]]);
}
if(operatie==3)
{
out<<heap[1]<<"\n";
}
//out<<"Heap dupa operatia "<<i<<" este "<<"\n";
//for(j=1;j<=inaltime;j++) out<<heap[j]<<" ";
//out<<"\n";
//out<<"Pozitiile lor sunt"<<"\n";
//for(j=1;j<=inaltime;j++) out<<pozitie[heap[j]]<<" ";
//out<<"\n";
}
in.close();
out.close();
return 0;
}