Pagini recente » Cod sursa (job #163642) | Cod sursa (job #318686) | Cod sursa (job #482905) | Cod sursa (job #2376922) | Cod sursa (job #340001)
Cod sursa(job #340001)
#include<cstdio>
#define N 200001
struct heap{int v,p;}h[N],aux,key;
int n,nh,v[N];
void cobor(int k)
{
int fiu;
do
{
fiu=0;
if (2*v[k]<=n)
{
fiu=v[2*k];
if (2*v[k]+1<=n&&h[fiu].v>h[v[2*k+1]].v)
fiu=v[2*k+1];
if(h[fiu].v>h[v[k]].v)
fiu=0;
}
if (fiu)
{
aux=h[v[k]];
h[v[k]]=h[fiu];
h[fiu]=aux;
v[k]=fiu;
}
}
while (fiu);
}
void urc(int k)
{
key=h[v[k]];
while (v[k]-1&&key.v<h[v[k/2]].v)
{
h[v[k]]=h[v[k/2]];
v[k]/=2;
}
h[v[k]]=key;
}
void cut(int k)
{
h[v[k]]=h[v[n]];
--n;
if (v[k]-1&&h[v[k]].v<h[v[k/2]].v)
urc(v[k]);
else
cobor(v[k]);
}
void insert(int x)
{
h[++n].v=x;
++nh;
h[n].p=nh;
v[n]=nh;
urc(v[n]);
}
void citire()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int c;
scanf("%d",&c);
while (c)
{
--c;
int w,c1;
scanf("%d",&w);
if (w==1)
{
scanf("%d",&c1);
insert(c1);
continue;
}
if (w==2)
{
scanf("%d",&c1);
cut(c1);
continue;
}
if (w==3)
{
printf("%d\n",h[1].v);
continue;
}
}
}
int main()
{
citire();
return 0;
}