Pagini recente » Cod sursa (job #1766754) | Cod sursa (job #1695785) | Cod sursa (job #2949689) | Cod sursa (job #2824670) | Cod sursa (job #1577159)
#include <iostream>// MinHeap
#include <fstream>
#define DMAX 200005
using namespace std;
int n, poz[DMAX], timp, nrop;
struct elem{
int inf,nr;
}H[DMAX],nod;
void inserare(int inf);
void creare_inserare();
void combinare(int i);
void creare_combinari();
int extrageMinim();
void heapsort();
void read();
void write();
int main()
{
freopen("heapuri.in","rt",stdin);
freopen("heapuri.out","wt",stdout);
//creare_combinari();
read();
//write();
//cout<<extrageMinim();
}
void read()
{
int x,op;
scanf("%d", &nrop);
for(int i=1;i<=nrop;i++)
{
scanf("%d", &op);
if(op==1){
scanf("%d", &x);
inserare(x);
}else if(op==3)
cout<<H[1].inf<<'\n';
else
{
scanf("%d", &x);
//nod=H[poz[x]];
H[poz[x]]=H[n--];
//poz[H[poz[x]].nr]=poz[H[n].nr];
combinare(poz[x]);
}
}
}
void inserare(int inf)
{
int fiu, tata;
fiu=++n;
tata=fiu/2;
while(tata>0 && H[tata].inf>inf)
{
H[fiu]=H[tata];
poz[H[tata].nr]=fiu;
fiu=tata;
tata=tata/2;
}
H[fiu].inf=inf;
H[fiu].nr=++timp;
poz[timp]=fiu;
}
/*
void creare_inserare()
{
int nr, x;
scanf("%d", &nr);
for(int i=1;i<=nr;i++)
{
scanf("%d", &x);
inserare(x);
}
}*/
void combinare(int i)
{
int inf=H[i].inf;//nodul care vreau sa fie radacina
int t=H[i].nr;
int tata=i;
int fiu=2*i;
while(fiu<=n){
if(fiu+1<=n && H[fiu].inf>H[fiu+1].inf) fiu++; //det. cel mai mic dintre fii
if(H[fiu].inf<=inf)//informatia
{//promovez pe cel mai mic dintre fii
H[tata]=H[fiu];
poz[H[fiu].nr]=tata;
tata=fiu;
fiu=2*tata;
}
else // am gasit locul potrivit
break;
}
H[tata].inf=inf;
H[tata].nr=t;
poz[t]=tata;
}
/*
void creare_combinari()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
scanf("%d", &H[i]);
for(int i=n/2; i>0; i--)//nodurile de la i la n nu au fii deci sunt heap-uri corecte
combinare(i);
}
void write()
{
for(int i=1;i<=n;i++)
cout<<H[i]<<' ';
cout<<'\n';
}
int extrageMinim()
{
int x=H[1].inf;
H[1]=H[n--];
combinare(1);
return x;
}*/