Pagini recente » Cod sursa (job #269796) | Cod sursa (job #2636278) | Cod sursa (job #53803) | Cod sursa (job #1717336) | Cod sursa (job #629134)
Cod sursa(job #629134)
#include<cstdio>
#include<algorithm>
using namespace std;
int n,tip,x,N,H[200010],P[200010];
void read(),solve(),heap_up(int),heap_down(int),insert(int),del(int);
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
}
void solve()
{
for(;n--;)
{
scanf("%d",&tip);if(tip==1 || tip==2)scanf("%d",&x);
if(tip==1){P[++N]=N;insert(x);}
if(tip==2)del(x);
if(tip==3)printf("%d\n",H[1]);
}
}
void insert(int val)
{
H[N]=val;
heap_up(N);
}
void del(int val)
{
int nod=P[val];
H[nod]=H[N--];
if(nod>1 && H[nod]<H[nod/2])
heap_up(nod);
else
heap_down(nod);
}
void heap_up(int nod)
{
int key=H[nod],poz=P[nod];
while(nod>1 && key<H[nod/2])
{
P[P[nod/2]]=nod;
H[nod]=H[nod/2];
nod=nod/2;
}
H[nod]=key;
P[poz]=nod;
}
void heap_down(int nod)
{
int fiu=1;
while(fiu)
{
fiu=0;
if(nod*2<=N && H[nod]>H[nod*2])fiu=nod*2;
if(nod*2+1<=N && H[nod*2+1]<H[nod*2])fiu=nod*2+1;
if(fiu)
{
swap(H[nod],H[fiu]);
nod=fiu;
}
}
}