Pagini recente » Cod sursa (job #1350526) | Cod sursa (job #527736) | Cod sursa (job #3276587) | Cod sursa (job #1971437) | Cod sursa (job #1164360)
#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,tos;
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;
tos=pozitii[tata];
pozitii[tata]=pozitii[fiu];
pozitii[fiu]=tos;
ordine[pozitii[tata]]=tata;
ordine[pozitii[fiu]]=fiu;
tata=fiu;
fiu=tata*2;
}
else gata=1;
}
gata=0;
tata=ordine[x]/2;
fiu=ordine[x];
while (tata>=1 && gata==0)
{
if (a[fiu]<a[tata])
{
aux=a[tata];
a[tata]=a[fiu];
a[fiu]=aux;
tos=pozitii[tata];
pozitii[tata]=pozitii[fiu];
pozitii[fiu]=tos;
ordine[pozitii[tata]]=tata;
ordine[pozitii[fiu]]=fiu;
fiu=tata;
tata=fiu/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;
}