Pagini recente » Cod sursa (job #562966) | Cod sursa (job #75582) | Cod sursa (job #2513627) | Cod sursa (job #1977451) | Cod sursa (job #2100319)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,i,j,k,p,op,pos,a[200001],b[200001],c[200001];
void pushup(int x)
{
int val;
val=b[a[x]];
while(x>1 && val<b[a[x/2]])
{
swap(a[x],a[x/2]);
c[a[x]]=x;
c[a[x/2]]=x/2;
x/=2;
}
}
void pushdown(int x)
{
int son;
do
{
son=0;
if(x*2<=m)
{
son=x*2;
if(x*2+1<=m && b[a[x*2+1]]<b[a[x*2]])
son=x*2+1;
if(b[a[son]]>=b[a[x]])
son=0;
}
if(son)
{
swap(a[son],a[x]);
swap(c[a[son]],c[a[x]]);
x=son;
}
}
while(son);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d\n",&n);
while(n)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d",&k);
b[++p]=k;///elementele (b[x]=elementul nr. x intrat in multime)
a[++m]=p;///valoarea nodului de pe pozitia x (b[a[x]]=valoarea)
c[p]=m;///pozitia elementului in heap (c[x]=pozitia lui b[x])
pushup(m);
}
else
if(op==2)
{
scanf("%d",&k);
pos=c[k];
a[pos]=a[m];
c[a[pos]]=pos;
m--;
pushdown(pos);
pushup(pos);
}
else
if(op==3)
printf("%d\n",b[a[1]]);
n--;
}
return 0;
}