Pagini recente » Cod sursa (job #1859862) | Cod sursa (job #667668) | Cod sursa (job #1198818) | Cod sursa (job #1417655) | Cod sursa (job #1042060)
#include<cstdio>
#include<cstring>
using namespace std;
int m,n,t,x,nr,a[200005],w[200005];
void interschimba(int poz1, int poz2)
{
int aux=w[poz1]; w[poz1]=w[poz2], w[poz2]=aux;
aux=a[poz1], a[poz1]=a[poz2], a[poz2]=aux;
}
void reconstituie_heap(int s, int lung)
{
int minim=s;
if (2*s<=lung && a[minim]>a[2*s]) minim=2*s;
if (2*s+1<=lung && a[minim]>a[2*s+1]) minim=2*s+1;
if (minim!=s)
{
interschimba(s,minim);
reconstituie_heap(minim,lung);
}
}
void construieste_heap(int lung)
{
int i;
for (i=lung/2;i;--i)
reconstituie_heap(i,lung);
}
int cauta(int val)
{
int i;
for (i=1;i<=n;++i)
if (w[i]==val) return i;
return 0;
}
int main()
{
int i;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&m);
for (i=0;i<m;++i)
{
scanf("%d",&t);
if (t==3)
{
construieste_heap(n);
printf("%d\n",a[1]);
}
else
{
scanf("%d",&x);
if (t==1)
{
a[++n]=x, w[n]=++nr;
}
else
{
interschimba(cauta(x),n);
--n;
}
}
}
return 0;
}