Pagini recente » Cod sursa (job #1252291) | Cod sursa (job #1946783) | Istoria paginii utilizator/monaluciastanica | Cod sursa (job #441373) | Cod sursa (job #2955223)
#include <fstream>
#define NMAX 200002
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int nrop,n,cnt,a[NMAX],p[NMAX],H[NMAX];///p[i]=pozitia celui de al i lea element citit in heap
void inserare(int x,int &n);
void combinare (int i);
void afisare();
int main()
{
int i,ind,op,x,poz;
fin>>nrop;
for(i=1; i<=nrop; i++)
{
fin>>op;
if(op==1)
{
fin>>x;
inserare(x,n);
a[n]=x;
}
else if(op==2)
{
fin>>ind;
poz=p[ind];
H[poz]=H[n];
p[H[n]]=poz;
n--;
combinare(poz);
}
else if(op==3)
fout<<a[H[1]]<<'\n';
//afisare();
}
return 0;
}
void inserare(int x,int &n)
{
int poz=n+1;
int tpoz=poz/2;
while(tpoz>0 && a[H[tpoz]]>x)
{
H[poz]=H[tpoz];
p[H[tpoz]]=poz;
poz=tpoz;
tpoz=poz/2;
}
n++;
H[poz]=n;
p[n]=poz;
}
void combinare (int i)
{
int x=a[H[i]],cine=H[i];
int tata=i,fiu=2*i;
while(fiu<=n)
{
if(fiu+1<=n && a[H[fiu+1]]<a[H[fiu]])
fiu++;
if(x<=a[H[fiu]])
break;
else
{
H[tata]=H[fiu];
p[H[fiu]]=tata;
tata=fiu;
fiu=2*fiu;
}
}
H[tata]=cine;
p[cine]=tata;
}
void afisare()
{
int i;
for(i=1; i<=n; i++)
fout<<H[i]<<' ';
fout<<'\n';
}