Pagini recente » Cod sursa (job #3225568) | Cod sursa (job #2240138) | Cod sursa (job #972677) | Cod sursa (job #1115755) | Cod sursa (job #1032629)
#include <cstdio>
#include <algorithm>
#include <cstring>
#define nmax 200010
#define inf 1<<30
using namespace std;
int a[nmax],b[nmax],poz[nmax],k,nro,n;
void heap(int nod)
{
if(a[2*nod]==-1)
return;
if(a[2*nod]<a[nod])
{
if(a[2*nod+1]<a[2*nod] && a[2*nod+1]!=-1)
{
swap(a[nod],a[2*nod+1]);
swap(poz[b[nod]],poz[b[2*nod+1]]);
swap(b[nod],b[2*nod+1]);
heap(2*nod+1);
}
else
{
swap(a[nod],a[nod*2]);
swap(poz[b[nod]],poz[b[2*nod]]);
swap(b[nod],b[2*nod]);
heap(2*nod);
}
}
heap(nod-1);
}
void heap1(int nod)
{
if(a[2*nod]==-1)
return;
if(a[2*nod]<a[nod])
{
if(a[2*nod+1]<a[2*nod])
{
swap(a[nod],a[2*nod+1]);
swap(poz[b[nod]],poz[b[2*nod+1]]);
swap(b[nod],b[2*nod+1]);
heap(2*nod+1);
}
else
{
swap(a[nod],a[nod*2]);
swap(poz[b[nod]],poz[b[2*nod]]);
swap(b[nod],b[2*nod]);
heap(2*nod);
}
}
}
void sterge(int x)
{
int p=poz[x];
a[p]=a[n];
heap1(p);
a[n--]=-1;
}
void inserare(int x)
{
a[++n]=x;
b[n]=++k;
poz[k]=n;
if(n>1)
heap(n/2);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int i,op,x;
memset(a,-1,sizeof(a));
scanf("%d",&nro);
for(i=1;i<=nro;i++)
{
scanf("%d",&op);
if(op!=3)
{
scanf("%d",&x);
if(op==1)
inserare(x);
if(op==2)
sterge(x);
}
else printf("%d\n",a[1]);
}
return 0;
}