Pagini recente » Cod sursa (job #1119346) | Cod sursa (job #1788161) | Cod sursa (job #284666) | Cod sursa (job #889381) | Cod sursa (job #1577162)
#include <fstream>
#define DMAX 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct elem
{
int inf;
int nr;
};
int n,nrop,ord;
elem H[DMAX];
int poz[DMAX];
void inserare(int val);
void combinare(int i); //i=pozitia nodului radacina
void afisare_min();
int main()
{
int i,tipop,x;
fin>>nrop;
for (i=1;i<=nrop;++i)
{
fin>>tipop;
if (tipop==3) afisare_min();
else
{
fin>>x;
if (tipop==1)
{
++ord;
inserare(x);
}
else
{
H[poz[x]]=H[n--];
combinare(poz[x]);
}
}
}
return 0;
}
void inserare(int val)
{
int fiu,tata;
fiu=++n;
tata=fiu/2;
while(tata>0 && H[tata].inf>val)
{
H[fiu]=H[tata];
poz[H[tata].nr]=fiu;
fiu=tata;
tata=tata/2;
}
H[fiu].inf=val;
H[fiu].nr=ord;
poz[ord]=fiu;
}
//https://mail.google.com/mail/u/0/#inbox
void combinare(int i)
{
int val=H[i].inf,tata=i,fiu=2*i;
while (fiu<=n) //cat timp mai exista fii
{
if (fiu+1<=n && H[fiu].inf>H[fiu+1].inf) fiu++;
//fiu indica cel mai mic dintre fii
if (H[fiu].inf<val)
{//promovez pe cel mai mic dintre fii
H[tata]=H[fiu];
poz[H[fiu].nr]=tata;
tata=fiu;
fiu=2*tata;
}
else break; //am gasit locul! Ies!
}
H[tata].inf=val;
H[tata].nr=ord;
poz[ord]=tata;
}
void afisare_min()
{
fout<<H[1].inf<<'\n';
}