Pagini recente » Cod sursa (job #1389820) | Cod sursa (job #1411534) | Cod sursa (job #117446) | Cod sursa (job #1169261) | Cod sursa (job #235660)
Cod sursa(job #235660)
//CRACIUN FERICIT
#include<stdio.h>
#define N 200010
int h[N],inh[N],n,v[N],nh,nv;
inline void swap(int &x,int &y)
{
int aux=x;
x=y;
y=aux;
}
inline int father(int x)
{
return x>>1;
}
inline int left_son(int x)
{
return x<<1;
}
inline int right_son(int x)
{
return (x<<1)+1;
}
void upheap(int k)
{
int key=h[k];
while(k>1 && v[key]<v[h[father(k)]])
{
h[k]=h[father(k)];
inh[h[k]]=k;
k=father(k);
}
h[k]=key;
inh[h[k]]=k;
}
void downheap(int k)
{
int son;
do
{
son=0;
if(left_son(k)<=nh)
{
son=left_son(k);
if(right_son(k)<=nh)
{
if(v[h[right_son(k)]]<v[h[son]])
son=right_son(k);
}
}
if(v[h[son]]>=v[h[k]])
son=0;
if(son)
{
swap(h[son],h[k]);
inh[h[k]]=k;
inh[h[son]]=son;
k=son;
}
}while(son);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
int cod;
for(; n; n--)
{
scanf("%d",&cod);
if(cod==1)
{
++nv;
scanf("%d",&v[nv]);
inh[nv]=++nh;
h[nh]=nv;
upheap(nh);
}
else
if(cod==2)
{
int x;
scanf("%d",&x);
h[inh[x]]=h[nh];
inh[h[nh]]=inh[x];
--nh;
downheap(inh[x]);
}
else
if(cod==3)
printf("%d\n",v[h[1]]);
}
return 0;
}