Pagini recente » Cod sursa (job #916967) | Cod sursa (job #696424) | Cod sursa (job #2972177) | Cod sursa (job #287147) | Cod sursa (job #1941319)
#include <iostream>
#include <cstdio>
using namespace std;
int k,n,i,cod,x,poz;
struct element
{
int elem,poz;
} v[200005];
bool viz[200005];
void adaugare(int x, int poz)
{
k++;
v[k].elem=x;
v[k].poz=poz;
poz=k;
viz[poz]=1;
while (v[poz].elem<v[poz/2].elem)
{
swap(v[poz],v[poz/2]);
poz=poz/2;
}
}
void stergere()
{
swap(v[1],v[k]);
k--;
int poz=1;
while ((v[poz].elem>v[poz*2].elem&&poz*2<=k) or (v[poz].elem>v[poz*2+1].elem&&poz*2+1<=k))
if (v[poz*2].elem>v[poz*2+1].elem && poz*2<=k)
{
swap(v[poz],v[poz*2+1]);
poz=poz*2+1;
}
else
{
swap(v[poz],v[poz*2]);
poz=poz*2;
}
}
void afisare()
{
int poz=1;
bool gasit=false;
while (gasit==false)
if (viz[v[poz].poz]==1)
{
printf("%d\n",v[poz].elem);
gasit=true;
}
else stergere();
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for (i=1; i<=n; i++)
{
scanf("%d",&cod);
if (cod!=3) scanf("%d",&x);
if (cod==1)
adaugare(x,++poz);
else if (cod==2)
viz[x]=0;
else afisare();
}
return 0;
}