Pagini recente » Cod sursa (job #2170767) | Cod sursa (job #1946167) | Cod sursa (job #1572385) | Cod sursa (job #2496604) | Cod sursa (job #604769)
Cod sursa(job #604769)
#include<stdio.h>
#include<algorithm>
#define maxn 200010
using namespace std;
int m,op,x,nr,N;
int Heap[maxn],A[maxn],Pos[maxn];
inline int father(int nod)
{
return nod/2;
}
inline int left_son(int nod)
{
return 2*nod;
}
inline int right_son(int nod)
{
return 2*nod+1;
}
void upheap(int k)
{
while(k/2 && A[Heap[k/2]]>A[Heap[k]])
{
swap(Heap[k/2],Heap[k]);
swap(Pos[Heap[k/2]],Pos[Heap[k]]);
k/=2;
}
}
void downheap(int k)
{
int son;
do
{
son=0;
if(left_son(k)<=N)
son=left_son(k);
if(right_son(k)<=N && ( A[Heap[left_son(k)]]>A[Heap[right_son(k)]]))
son=right_son(k);
if(A[Heap[son]]>A[Heap[k]])
son=0;
if(son)
{
swap(Heap[son],Heap[k]);
swap(Pos[Heap[son]],Pos[Heap[k]]);
k=son;
}
}
while(son);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&op);
if(op<3)
{
scanf("%d",&x);
if(op==1)
{
nr++,N++;
A[nr]=x;
Heap[N]=nr;
Pos[nr]=N;
upheap(N);
}
if(op==2)
{
A[x]=-1;
upheap(Pos[x]);
Pos[Heap[1]] = 0;
Heap[1] = Heap[N--];
Pos[Heap[1]] = 1;
if (N>1) downheap(1);
}
}
if (op == 3) printf("%d\n", A[Heap[1]]);
}
}