Pagini recente » Cod sursa (job #2397054) | Cod sursa (job #503259) | Cod sursa (job #140745) | Monitorul de evaluare | Cod sursa (job #524153)
Cod sursa(job #524153)
#include<algorithm>
using namespace std;
#define N_MAX 200005
int dimHeap;
int heap[N_MAX],poz[N_MAX];
int a[N_MAX];
int n,i,j,N;
int op,x;
void upHeap(int x)
{
while(1<x&&a[ heap[x>>2] ]>a[ heap[x] ])
{
swap(poz[ heap[x>>2] ],poz[ heap[x] ]);
swap(heap[x>>2],heap[x]);
x=x>>2;
}
}
void downHeap(int x)
{
int st=x<<2;
int dr=(x<<2)+1;
int minim=x;
if(st<=dimHeap&&a[ heap[st] ]<a[ heap[minim] ])
minim=st;
if(dr<=dimHeap&&a[ heap[dr] ]<a[ heap[minim] ])
minim=dr;
if(minim!=x)
{
swap(poz[ heap[x] ],poz[ heap[minim] ]);
swap(heap[x],heap[minim]);
downHeap(minim);
}
}
void sterge(int x)
{
swap(poz[ heap[x] ],poz[ heap[dimHeap] ]);
swap(heap[x],heap[dimHeap]);
dimHeap--;
if(a[ heap[x/2] ]>a[ heap[x] ])
upHeap(x);
else
downHeap(x);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d",&x);
a[++N]=x;
heap[++dimHeap]=N;
poz[N]=dimHeap;
upHeap(dimHeap);
}else
if(op==2)
{
scanf("%d",&x);
sterge(poz[x]);
}else
if(op==3)
{
printf("%d\n",a[ heap[1] ]);
}
}
return 0;
}