Pagini recente » Cod sursa (job #29616) | Cod sursa (job #927898) | Cod sursa (job #276146) | Cod sursa (job #2309611) | Cod sursa (job #1164309)
#include<fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n,a[200005],lungime,ordine[200005],ordinelung,pozitii[200005];
inline void Insereaza(int x)
{
int cacat,aux,tos;
a[++lungime]=x;
ordine[++ordinelung]=lungime;
cacat=lungime/2;aux=lungime;
pozitii[lungime]=ordinelung;
while (cacat && a[cacat]>x)
{
a[aux]=a[cacat];
a[cacat]=x;
tos=ordine[ordinelung];
ordine[ordinelung]=cacat;
ordine[pozitii[cacat]]=tos;
pozitii[tos]=pozitii[cacat];
pozitii[cacat]=ordinelung;
aux>>=1;
cacat>>=1;
}
}
inline void Sterge(int x)
{
int fiu,tata,aux,gata=0;
pozitii[ordine[x]]=pozitii[lungime];
ordine[pozitii[lungime]]=ordine[x];
a[ordine[x]]=a[lungime];
lungime--;
fiu=ordine[x]*2;
tata=ordine[x];
while (fiu<=lungime && gata==0)
{
if (fiu+1<=lungime && a[fiu+1]<a[fiu])
fiu++;
if (a[fiu]<a[tata])
{
aux=a[tata];
a[tata]=a[fiu];
a[fiu]=aux;
tata=fiu;
fiu=tata*2;
}
else gata=1;
}
}
int main()
{
int i,op,x;
fin>>n;
for (i=1;i<=n;i++)
{
fin>>op;
if (op==1)
{
fin>>x;
Insereaza(x);
}
else if (op==2)
{
fin>>x;
Sterge(x);
}
else fout<<a[1]<<"\n";
}
return 0;
}