Pagini recente » Cod sursa (job #3263539) | Cod sursa (job #2122747) | Cod sursa (job #2738839) | Cod sursa (job #43047) | Cod sursa (job #3175555)
#include <fstream>
#define NMAX 200005
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
///min heap
int n,H[NMAX],t,q,pozi[NMAX],contor,aux,p[NMAX],aux1,x;
void combinare(int poz);
void creare_combinare();
int ExtrageMin();
void afisare();
void creare_inserare();
void inserare(int x);
int main()
{
fin>>t;
while(t--)
{
fin>>q;
if(q==1)
{
fin>>x;
pozi[n+1]=++contor;
p[contor]=n+1;
inserare(x);
}
else
if(q==3)
{
fout<<H[1]<<'\n';
}
else
if(q==2)
{
fin>>aux;
aux1=p[aux];
p[pozi[n]]=aux1;
pozi[aux1]=pozi[n];
H[aux1]=H[n--];
combinare(aux1);
}
}
return 0;
}
void inserare(int x)
{
int fiu,tata,pozx;
pozx=pozi[n+1];
fiu=++n;
tata=fiu/2;
while(tata>0 && H[tata]>x)
{
H[fiu]=H[tata];
p[pozi[tata]]=fiu;
pozi[fiu]=pozi[tata];
fiu=tata;
tata=fiu/2;
}
H[fiu]=x;
pozi[fiu]=pozx;
p[pozx]=fiu;
}
void combinare(int poz)
/// se combina nodul de pe poz cu minheapurile corecte cu radacinile in 2poz si 2poz+1
{
int tata,fiu,x,pozx,px;
x=H[poz];
// px=p[pozi[poz]]
pozx=pozi[poz];
tata=poz;
fiu=2*tata;
while(fiu<=n)
{
if(fiu+1<=n && H[fiu+1]<H[fiu])
fiu++;
if(H[fiu]<x)
{
p[pozi[fiu]]=tata;
pozi[tata]=pozi[fiu];
H[tata]=H[fiu];
tata=fiu;
fiu=2*tata;
}
else
break;
}
H[tata]=x;
pozi[tata]=pozx;
p[pozx]=tata;
}
void creare_combinare()
{
for(int i=n/2;i>0;i--)
combinare(i);
}
int ExtrageMin()
{
int minim=H[1];
// H[1]=H[n--];
// combinare(1);
return minim;
}
///poz[i] poz pe care se afla in heap al i lea element in heap