Pagini recente » Cod sursa (job #1030707) | Cod sursa (job #476847) | Cod sursa (job #2902744) | Cod sursa (job #11563) | Cod sursa (job #3175546)
#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;
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)
{
pozi[++n]=++contor;
p[contor]=n;
fin>>H[n];
}
else
if(q==3)
{
creare_combinare();
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--];
}
}
return 0;
}
void creare_inserare()
{
int x,nn;
fin>>nn;
for(int i=1;i<=nn;i++)
{
fin>>x;
inserare(x);
}
}
void afisare()
{
for(int i=1;i<=n;i++)
fout<<H[i]<<' ';
}
void inserare(int x)
{
int fiu,tata;
fiu=n+1;
tata=fiu/2;
while(tata>0 && H[tata]>x)
{
H[fiu]=H[tata];
tata=fiu/2;
}
H[fiu]=x;
}
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