Pagini recente » Cod sursa (job #2476795) | Cod sursa (job #654784) | Cod sursa (job #2534045) | Cod sursa (job #531289) | Cod sursa (job #1537876)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
int n, q=1, x,p;
int e[200000], poz[200000];
typedef int Heap[200000];
Heap H;
int tata(int nod)
{return nod/2;}
int fiu_stg(int nod)
{return nod*2;}
int fiu_dr(int nod)
{return nod*2+1;}
void Interschimba(int &x, int &y)
{ int aux;
aux=x;
x=y;
y=aux;
}
void coboara(Heap H, int n, int k)
{int fiu;
do
{ fiu=0;
if(fiu_stg(k)<=n)
{fiu=fiu_stg(k);
if(fiu_dr(k)<=n && H[fiu_dr(k)]<H[fiu_stg(k)])
fiu=fiu_dr(k);
if(H[fiu]>=H[k])
fiu=0;}
if(fiu)
{Interschimba(H[k],H[fiu]);
k=fiu;}}
while(fiu);
}
void urca(Heap H, int n, int k)
{
int m=H[k];
poz[k]=k;
int pp=k;
while (k>1 && m<H[tata(k)])
{
H[k]=H[tata(k)];
Interschimba(poz[pp],poz[tata(k)]);
k=tata(k);
}
H[k]=m;
}
void elimina(Heap H, int &n, int k)
{
H[k]=H[n];
n--;
if (k>1 && H[k]>H[tata(k)])
urca(H, n, k);
else
coboara(H, n, k);
}
int main()
{
in>>n;
int i, l=0;
for(i=0; i<n; i++)
{
in>>p;
if(p==1)
{
in>>x;
poz[q]=q;
H[q]=x;
urca(H, q, q);
q++;
/*for(int j=1;j<q;j++)
cout<<H[j]<<' ';
cout<<endl;
for(int j=1;j<q;j++)
cout<<j<<' '<<poz[j]<<endl;
cout<<endl;*/
}
else
if(p==2)
{
in>>x;
int nr=q-1;
elimina(H,nr,poz[x]);
}
else
if(p==3)
out<<H[1]<<'\n';
}
in.close();
out.close();
return 0;
}